Java 休眠选择子对象进入界面
要仅收集所需数据,我使用以下查询进行对象声明:Java 休眠选择子对象进入界面,java,hibernate,jpa,Java,Hibernate,Jpa,要仅收集所需数据,我使用以下查询进行对象声明: @Query(value=“选择d.id作为id” +,d.状态更改为状态更改 +“来自声明d”, countQuery=“从声明中选择计数(id”) 页面findAllDeclarationListIDTO(可分页可分页); 声明to有一个getId()和一个getStatusChanged() 这很有效 现在我想添加自由职业者的id,如下所示: @Query(value=“选择d.id作为id” +,d.状态更改为状态更改 +“,f.id为‘
@Query(value=“选择d.id作为id”
+,d.状态更改为状态更改
+“来自声明d”,
countQuery=“从声明中选择计数(id”)
页面findAllDeclarationListIDTO(可分页可分页);
声明to
有一个getId()
和一个getStatusChanged()
这很有效
现在我想添加自由职业者的id,如下所示:
@Query(value=“选择d.id作为id”
+,d.状态更改为状态更改
+“,f.id为‘自由职业者身份’”
+“从声明d加入d自由职业者f”,
countQuery=“从声明中选择计数(id”)
页面findAllDeclarationListIDTO(可分页可分页);
声明to
有一个getFreelayer()
,它有一个getId()
,但我得到一个错误:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting IDENT, found ''freelancer.id'' near line 1, column 66 [select d.id as id , d.statusChanged as statusChanged , f.id as 'freelancer.id' from nl.tibi.sbys.domain.Declaration d join d.freelancer f]
知道如何使用对象链吗
可能的解决办法:
1) 展平界面:
@Query(value = "select d.id as id "
+ " , d.statusChanged as statusChanged "
+ " , f.id as 'freelancer_id' "
+ " from Declaration d join d.freelancer f",
countQuery="select count(id) from Declaration")
Page<DeclarationIDTO> findAllDeclarationListIDTO(Pageable pageable);
@Query(value = "select new DeclarationDTO(d.id "
+ " , d.statusChanged "
+ " , f.id) "
+ " from Declaration d join d.freelancer f",
countQuery="select count(id) from Declaration")
Page<DeclarationDTO> findAllDeclarationListIDTO(Pageable pageable);
页面findAllDeclarationListIDTO(可分页可分页)
DeclarationDTO
有一个getId()
getStatusChanged()
和getFreelayer()
这是可行的,因为仍有大量数据被收集,这对性能是不利的
如果有一个简单的解决方案获得f.id,它将解决所有的缺点
这里似乎有一个答案:
什么时候我会研究它。1)您的声明必须具有id和statusChange参数的构造函数,顺序如下
2)尝试使用完全限定名在查询中添加新运算符:
"select new my.package.DeclarationIDTO(d.id as id, d.statusChanged as statusChanged "
+ " , f.id as 'freelancer.id' "
+ " from Declaration d join d.freelancer f",
谢谢,但是第一个示例在没有任何构造函数的情况下工作。如果我要走构造函数路线,我需要很多构造函数来应对每种情况,所以我宁愿避免这种情况。问题是我可以在声明中选择好,但不能选择它的子对象FreedorRid,只要在DTOI中创建一个FreedorRid,如果这是唯一可能的字段,但我需要更多的字段,这将是重复字段。我希望有一种方法,但可能不仅仅是使用直接字段的接口,也可以使用链接字段的接口。但可能是hibernate/jpa不支持这个功能。您使用spring数据jpa吗?您是否声明了DeclarationIDTO和FreeletIdto作为接口?
"select new my.package.DeclarationIDTO(d.id as id, d.statusChanged as statusChanged "
+ " , f.id as 'freelancer.id' "
+ " from Declaration d join d.freelancer f",