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",