hibernate HQL createQuery () list () тип приведения к модели напрямую

когда я использую list () Hibernate (HQL) после createQuery (), то я хочу напрямую ввести cast List<Object[]> мой List<POJO class>. Здесь я описываю свой реальный сценарий. У меня есть 3 простых старых Java-объекта, которые говорят Person, Operation и Project, а таблица говорит Transaction с иностранными ссылками на Person, Operation и Project.

class Person {
  String name;
  // getters and setters
}

class Operation {
  String name;
  // getters and setters
}

class Project {
  String name;
  // getters and setters
}

class Transaction {
  String p_id;
  String o_id;
  String project_id;
  // refers to id of All three table above
}

теперь я хочу выполнить запрос языка запроса Hibernate String query="select p.name, o.name, project.name from Person p , Operation o, Project project , Transaction t where p.id=2 and p.id=t.p_id and o.id=t.o_id and project.id=t.project_id".

Я создал класс модели для вывода этого запроса сказать POP_Model.

private class POP_Model {
  String person_name;
  String operation_name;
  String project_name;
}

теперь, я хочу использовать Hibernate-запроса:

Session session=HibernateConnection.getSessionFactory().openSession();
Query q=session.createQuery(query);
List<POP_Model> list=(List<POP_Model>)q.list();

он дает ошибку typecast, говоря, что объект[] не может быть преобразован в POP_Model. Я проверил TypedQuery, но не получил примера для него. Но, насколько я знаю, TypedQuery можно использовать для сопоставления с POJO, а не моделью. Я хочу напрямую ввести cast в модель.

2 ответов


Если вы в порядке с использованием API JPA (который также реализует Hibernate) вместо API Hibernate для этого, вы можете использовать запросы конструктора JPQL:

List<DTO> dtos = entityManager.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").getResultList();

редактировать похоже, что Hibernate реализует выражения конструктора с помощью обычного API:

List<DTO> dtos = session.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").list();

EDIT2 JPA-это стандарт Java EE, объединяющий работу с различными библиотеками персистентности, такими как Hibernate и EclipseLink. The oracle учебник вполне приличная.

вы можете получить EntityManager в приложении, отличном от EE, как это:

  @PersistenceUnit
  private EntityManagerFactory emf;
  ...
  EntityManager em = emf.createEntityManager();

сначала создайте конструктор в классе POJO.

private class POP_Model {
  String person_name;
  String operation_name;
  String project_name;

  public POP_Model(String person_name, String operation_name, String project_name){
      this.person_name = person_name;
      this.operation_name = operation_name;
      this.project_name = project_name;
  }
}

затем вы можете использовать

select new com.server.dtos.POP_Model(p.name, o.name, project.name) 
from Transaction t INNER JOIN t.operation o
INNER JOIN t.person p 
INNER JOIN t.project project  
where p.id=2

Для справки -официальная документация. Пройти через новый объект с HQL как хорошо.