考虑表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。
答案 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