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

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

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

Сначала вы создаете 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 учебный класс.

Другие вопросы по тегам