如何在加载特定父项或其他映射实体属性时修改HQL转换器?

7 hibernate hql resulttransformer

这是一个重要的补充,特别是在能够编写高效的动态HQL查询时解决性能问题.

但是,如果加载特定父项或另一个映射实体属性,我们如何修改HQL转换器?

以下代码:

session.createQuery(
    "select st.stNumber as stNumber, st.stDate as stDate "
    + " from SomeTable st "
    + " where st.someTableId < 1000")
    .setResultTransformer( Transformers.aliasToBean(database.SomeTable.class))
.list();
Run Code Online (Sandbox Code Playgroud)

工作正常,但如果我只想加载一些父母的属性怎么办?

例如,让我们说,SomeTable有一个父母被叫SomedParent,我想只访问这个父母的一个字段?

session.createQuery(
    "select st.stNumber as stNumber, st.stDate as stDate, st.someParent.someParentField as someParentField "
    + " from SomeTable st "
    + " where st.someTableId < 1000")
    .setResultTransformer( Transformers.aliasToBean(database.SomeTable.class))
.list();
Run Code Online (Sandbox Code Playgroud)

那么任何想法?

Dhe*_*rik 0

你几乎是对的。

\n\n

首先,您创建SomeTable

\n\n
class SomeTable {\n    private Long stNumber;\n    private Date stDate;\n    private String someParentField;\n\n    //getters and setters\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

和你的查询:

\n\n
session.createQuery(\n    "select st.stNumber as stNumber, st.stDate as stDate, someParent.someParentField as someParentField "\n    + " from SomeTable st "\n    + " JOIN st.someParent someParent"\n    + " where st.someTableId < 1000")\n    .setResultTransformer( Transformers.aliasToBean(SomeTable.class))\n.list();\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这种情况下,您不需要为该类创建构造函数SomeTable

\n