【问题标题】:Perform join on two tables in HQL在 HQL 中对两个表执行连接
【发布时间】:2017-12-07 13:16:10
【问题描述】:

考虑表 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。AAA 的查询如下:

select X from A X where COLUMNVAL= serialID;

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

我尝试了下面的查询,因为 java.lang.object 无法转换为 A,所以我得到了 classcast 异常

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

请支持如何进一步进行。 A 有大量的列,因此 ResultList 不是首选。

【问题讨论】:

  • 你有指定的映射吗?
  • 都是注释
  • 还不错.. 你能把最重要的部分放好吗
  • 对不起?我不明白你
  • 你能包含完整的堆栈跟踪吗?您能否在另一个工具中运行查询以检查它是否有效?

标签: java hibernate hql


【解决方案1】:

我尝试了以下查询,我得到了 classcast 异常 java.lang.object 不能转换为 A

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

如果您希望使用该查询,您将不会获得 A 类的对象,而是一个对象数组,其中第一个元素是类的对象,第二个元素是值 Q.xyz

所以你应该使用

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

【讨论】:

    【解决方案2】:

    创建一个ResultDTO 类,它扩展了实体类A,因此具有来自类A 的所有字段,并有自己的实体类B 的必填字段(xyz)。现在你可以这样做得到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

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • 很抱歉没有意识到这一点。我已经添加了答案的重要部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2018-12-22
    • 2023-04-05
    • 2015-05-16
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多