我是hql的新手,正在尝试编写一个包含两个实体的查询。这是遗留代码并添加 @OneToOne
与客户的关系 FirstEntity
这将是一项艰巨的任务。
另一方面,我可以改变 firstEntityReference
拥有 @OneToOne
.
@Entity
public FirstEntity {
private long firstEntityId;
...
}
第二实体:
@Entity
public SecondEntity {
private long secondEntityId;
/*
* I could Change this to:
* @OneToOne
* private FirstEntity firstEntityReference;
* But not sure if it would help with anything
*/
private long firstEntityReference;
private boolean deleted;
...
}
问题是有没有可能像这样做:
select fe.* from FirstEntity fe
left join SecondEntity se on fe.firstEntityId = se.firstEntityReference
where (se is null or se.deleted = 1)
请记住,查询的根必须是 FirstEntity
. 我想弄清楚这里是否可以加入: Join<FirstEntity, SecondEntity> join = ...
但我还没弄明白。
2条答案
按热度按时间nzrxty8p1#
正如我在另一个问题中所写的那样,在使用blaze持久性时,您只能通过criteria api使用它:https://stackoverflow.com/a/58037766/412446
除此之外,您只能使用hql。实际上,您编写的查询应该可以工作。
bkkx9g8r2#
在我的理解中,涉及到您的问题的一个类似问题是如何使用jpa标准api连接不相关的实体。不幸的是,它没有被标记为已解决,但我认为弗拉德米哈尔凯斯的答案是一个,你可能想遵循。
编辑链接问题提供了很多选项:当前hibernate、nativequery或jooq。如果出于任何原因它们都不适合你,那么你的方法也可能奏效。但是,您应该记住,您有真正的onetoone语义,这意味着每个第二个实体只属于一个或零个第一个实体,并且第一个实体引用是唯一的,否则您可能会遇到意外的行为。也许也可以多通Map更合适,根据你的情况,我不知道你的db设计?如果您不能使用遗留数据库来添加真正的约束,您可能还需要告诉hibernate。看看这里的鸡尾酒课https://www.baeldung.com/jpa-query-unrelated-entities