Как мы модифицируем HQL-преобразователь при загрузке определенного родительского или другого сопоставленного свойства объекта? - PullRequest
7 голосов
/ 27 октября 2008

Это важное дополнение, особенно для решения проблем с производительностью при возможности написания эффективных динамических 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();

отлично работает, но что если я захочу загрузить только некоторые из его родительских свойств?

Например, скажем, у 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();

Так есть идеи?

1 Ответ

0 голосов
/ 21 декабря 2018

Вы почти правы.

Сначала вы создаете SomeTable:

class SomeTable {
    private Long stNumber;
    private Date stDate;
    private String someParentField;

    //getters and setters
}

И ваш запрос:

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

В этом случае вам не нужно создавать конструктор для класса SomeTable.

...