hibernate HQL createQuery()list()类型直接转换为模型 [英] hibernate HQL createQuery() list() type cast to model directly

查看:154
本文介绍了hibernate HQL createQuery()list()类型直接转换为模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我在createQuery()之后使用Hibernate(HQL)的list()时,我想直接输入cast List< Object []> 到我的 List< POJO class> 。我在这里描述我的实际情况。我有3个普通的旧Java对象说Person,Operation和Project和一个表格说事务与外部引用Person,Operation和Project。

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

class操作{
字符串名称;
// getters and setters
}

class Project {
String name;
//获取器和设置器
}

类事务{
String p_id;
String o_id;
String project_id;
//引用上面所有三个表的id
}

现在,我想执行一个Hibernate查询语言查询,比如说
String query =从p中选择p.name,o.name,project.name,o操作o,Project项目,Transaction t其中p .id = 2和p.id = t.p_id和o.id = t.o_id和project.id = t.project_id



我为这个查询的输出创建了一个Model类,声明为POP_Model。

  private class POP_Model {
String person_name;
字符串操作名称;
String project_name;
}

现在,我想使用Hibernate查询:

  Session session = HibernateConnection.getSessionFactory()。openSession(); 
Query q = session.createQuery(query);
清单< POP_Model>列表=(列表与LT; POP_Model>)q.list();

它给出了类型错误,表示Object []不能转换为POP_Model。我检查了TypedQuery,但没有得到它的例子。但据我所知,TypedQuery可以用来映射到POJO而不是Model。我希望直接将类型转换为Model。

解决方案

如果您使用JPA API(Hibernate也实现了该功能)您可以使用JPQL构造函数查询来代替Hibernate API:

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

EDIT 看起来Hibernate使用常规API实现构造函数表达式:

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

EDIT2 JPA是一个Java EE标准,统一与不同的持久性库像Hibernate和EclipseLink。 oracle教程 相当体面。



您可以像这样在非EE应用程序中检索EntityManager:

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


When I use list() of Hibernate (HQL) after createQuery(), then I want to directly type cast List<Object[]> to my List<POJO class>. I describe my actual scenario here. I have 3 Plain Old Java Objects say Person, Operation and Project and a table say Transaction with foreign references to Person , Operation and 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
}

Now, I want to execute a Hibernate Query Language query say 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".

I have created a Model class for output of this query say POP_Model.

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

Now, I want to use Hibernate query:

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

It gives typecast error saying Object[] cannot be converted to POP_Model. I checked out TypedQuery but didn't get an example for it. But as far as I know, TypedQuery can be used to map to POJO not Model. I want to directly type cast to Model.

解决方案

If you are OK with using the JPA API (which Hibernate implements as well) instead of the Hibernate API for this, you can use JPQL constructor queries:

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

EDIT It looks like Hibernate implements constructor expressions with it's regular API as well:

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

EDIT2 JPA is a Java EE standard, unifying working with different persistence libraries like Hibernate and EclipseLink. The oracle tutorial is quite decent.

You can retrieve an EntityManager in a non-EE application like this:

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

这篇关于hibernate HQL createQuery()list()类型直接转换为模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆