hibernate HQL createQuery()列表()类型直接转换为模型

hibernate HQL createQuery()列表()类型直接转换为模型,hibernate,model-view-controller,struts2,Hibernate,Model View Controller,Struts2,当我在createQuery()之后使用Hibernate(HQL)的list()时,我想直接将castlist输入我的list。我在这里描述我的实际情况。我有3个简单的旧Java对象,比如Person、Operation和Project,还有一个表,比如带有对Person、Operation和Project的外部引用的事务 class Person { String name; // getters and setters } class Operation { String n

当我在createQuery()之后使用Hibernate(HQL)的list()时,我想直接将cast
list
输入我的
list
。我在这里描述我的实际情况。我有3个简单的旧Java对象,比如Person、Operation和Project,还有一个表,比如带有对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=“从人员p、操作o、项目项目、事务t中选择p.name、o.name、project.name,其中p.id=2和p.id=t.p\u id和o.id=t.o\u id和project.id=t.project\u id”

我已经为这个查询的输出创建了一个模型类,比如POP_模型

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();
会话会话=HibernateConnection.getSessionFactory().openSession(); Query q=session.createQuery(查询); List=(List)q.List();
它给出类型转换错误,表示对象[]无法转换为POP_模型。我签出了TypedQuery,但没有得到它的示例。但据我所知,TypedQuery可以用来映射到POJO而不是模型。我想直接键入cast to Model。

如果您同意使用JPA API(Hibernate也实现了该API)而不是Hibernate API,那么可以使用JPQL构造函数查询:

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

首先在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
供参考,这里是。
也要进行检查。

更好地解决问题的方法之一是切换到criteria API。“criteria API”的意思是什么?你能提供任何链接吗?我第一次接触到JPAAPI。你能给我推荐JPA例子的好链接吗。我正在使用Struts 2应用程序。第二,我如何获得entityManager对象?@Misha-添加了一些细节,希望它能进一步帮助您。在我看来,您不应该陷入学习新API的泥潭,hibernate本机提供了此功能,所以我现在选择hibernate版本,以后再考虑JPA。@kostja-当我的查询返回模型对象列表时会发生什么?如果我想要这样的查询
字符串查询=“从人员p、操作o、项目项目、事务t中选择p.name、o.name、project.name,其中p.id>2,p.id=t.p\u id,o.id=t.o\u id和project.id=t.project\u id
@Misha-恐怕我不太理解这个问题。构造函数表达式的本质是,您可以使用新运算符将不同实体的所有单个属性组合成不同的类型。如果您这样包装它:
选择NEW com.example.Model(p.name、o.name、project.name)
您可以保留查询的其余部分,并获得一个模型对象列表作为结果。如果这不能回答你的问题,请随意更深入地解释一下你的意思,我将尝试回答。
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