在HQL中对两个表执行连接

时间:2017-12-07 13:16:10

标签: java hibernate hql

考虑表A和B.需要采用表A中的整列和表B中的一列。以前,创建一个命名查询,使用该查询获取表A的整个列值。现在我还需要包括一列表B.

在DAO课程中,下面是代码

X x=null
 Query query = getEntityManager().createNamedQuery("AAA").setParameter("serialID",val);
 x=(X) query.getSingleResult()

在DTO类中,AAA是X类的一部分,它引用了表A.AQ的查询如下:

select X from A X where COLUMNVAL= serialID;

现在,表B也有COLUMNVAL,我需要考虑该表中xyz列的值.Consider xyz在Q类中映射。

我尝试了下面的查询,因为java.lang.object无法强制转换为A

select X, Q.xyz from A X, B Q where X.COLUMNVAL = Q.COLUMNVAL AND X.COLUMNVAL=serialID

请支持如何继续进行。 A具有大量列,因此不希望使用ResultList。

2 个答案:

答案 0 :(得分:0)

  

我尝试了下面的查询,其中我得到了classcast异常   java.lang.object无法强制转换为A

     

从A X,B Q中选择X,Q.xyz,其中X.COLUMNVAL = Q.COLUMNVAL AND   X.COLUMNVAL = serialID

如果你想使用那个查询,你将获得A类的对象,而不是一个Object数组,其中第一个元素是类的对象,第二个元素是值Q.xyz

所以你应该使用

Object[] x;
x=(Object[]) query.getSingleResult()

答案 1 :(得分:0)

创建一个ResultDTO类,它扩展实体类A,从而拥有类A中的所有字段,并拥有实体类{xyz的必需字段B {1}}。现在,您可以执行此操作以获取ResultDTO

String queryString = "select a, b.xyz from A a join B b on(a.field = b.field)"
            + " where a.serialID = :serialID";  

return (List<ResultDTO>) entityManager.createQuery(queryString)
    .setParameter("serialID", serialId);
    .unwrap(org.hibernate.query.Query.class)
    .setResultTransformer(Transformers.aliasToBean(ResultDTO.class))
    .getResultList();

此外,我建议你阅读这篇文章The best way to map a projection query to a DTO (Data Transfer Object) with JPA and Hibernate