【问题标题】:hibernate HQL createQuery() list() type cast to model directlyhibernate HQL createQuery() list() 类型直接转换为模型
【发布时间】:2013-02-26 16:24:38
【问题描述】:

当我在 createQuery() 之后使用 Hibernate (HQL) 的 list() 时,我想直接键入 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 Query Language 查询说 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();

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

【问题讨论】:

  • 更好地解决问题的方法之一是切换到条件 API。
  • “Criteria Api”是什么意思?你能引用它的任何链接吗?

标签: hibernate model-view-controller struts2


【解决方案1】:

如果您可以使用 JPA API(Hibernate 也实现)而不是 Hibernate API,您可以使用 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)的工作。 oracle tutorial 相当不错。

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

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

【讨论】:

  • 我第一次接触到 JPA API。你能给我推荐JPA示例的好链接吗?我正在使用 Struts 2 应用程序。其次,如何获取 entityManager 对象?
  • @Misha - 添加了一些细节,希望它可以进一步帮助你。 IMO 你不应该陷入学习新 API 的困境,hibernate 本身就提供了这个功能,所以我现在会使用 hibernate 版本,以后记住 JPA。
  • @kostja- 当我的查询返回模型对象列表时会发生什么?就像我想要这样的查询String query="select p.name, o.name, project.name from Person p , Operation o, Project project , Transaction t where p.id&gt;2 and p.id=t.p_id and o.id=t.o_id and project.id=t.project_id
  • @Misha - 恐怕我不太明白这个问题。构造函数表达式的本质是您可以使用 NEW 运算符将不同实体的所有单个属性组合成不同的类型。如果你像这样包装它:select NEW com.example.Model(p.name, o.name, project.name) 你可以保留查询的其余部分并得到一个模型对象列表作为结果。如果这不能回答您的问题,请随时更深入地解释您的意思,我会尽力回答。
【解决方案2】:

首先在 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

供参考,这里是official documentation。 也通过New object with HQL

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 2018-04-04
    • 2018-10-06
    • 2016-08-13
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多