Подтвердить что ты не робот

Получение результата в DTO с собственным SQL-запросом в спящем режиме

У меня есть запрос, как показано ниже

select f.id, s.name, ss.name
from first f
left join second s on f.id = s.id
left join second ss on f.sId = ss.id

Если бы я мог использовать HQL, я бы использовал синтаксис конструктора HQL, чтобы напрямую заполнить DTO с помощью набора результатов. Но, поскольку спящий режим не позволяет левому объединению, не имея ассоциации, я должен использовать собственный SQL-запрос.

В настоящее время я просматриваю результирующий набор в стиле JDBC и заполняю объекты DTO. Есть ли более простой способ достичь этого?

4b9b3361

Ответ 1

Возможно, вы можете использовать трансформатор результатов. Цитирование Hibernate 3.2: Трансформаторы для HQL и SQL:

Преобразователи SQL

С исходным sql возвращающим не-сущностью beans или Карта часто более полезны вместо базового Object[]. С трансформаторы результатов, которые сейчас возможно.

List resultWithAliasedBean = s.createSQLQuery(
  "SELECT st.name as studentName, co.description as courseDescription " +
  "FROM Enrolment e " +
  "INNER JOIN Student st on e.studentId=st.studentId " +
  "INNER JOIN Course co on e.courseCode=co.courseCode")
  .addScalar("studentName")
  .addScalar("courseDescription")
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  .list();

StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);

Совет: звонки addScalar() были требуется для HSQLDB, чтобы он соответствовал имя свойства, так как он возвращает столбец имена во всех прописных буквах (например, "ИМЯ УЧЕНИКА" ). Это также может быть решаются с помощью настраиваемого трансформатора, который поиск имен свойств вместо используя точное совпадение - возможно, мы должны предоставить метод fuzzyAliasToBean();)

Ссылки