получение набора результатов в DTO с помощью собственного SQL-запроса в Hibernate - PullRequest
36 голосов
/ 15 октября 2010

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

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 набором результатов. Но, поскольку hibernate не разрешает левое соединение без наличия связи, я должен использовать собственный SQL-запрос.

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

1 Ответ

59 голосов
/ 15 октября 2010

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

SQL Transformers

С нативным SQL, возвращающим не-сущность бобы или карты часто полезнее вместо базового 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 ();)

Ссылки

...