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 как хорошо.