criteriaapi-left连接实体,其中连接列是连接表的一部分,没有定义关系

laik7k3q  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(391)

我是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 = ... 但我还没弄明白。

nzrxty8p

nzrxty8p1#

正如我在另一个问题中所写的那样,在使用blaze持久性时,您只能通过criteria api使用它:https://stackoverflow.com/a/58037766/412446
除此之外,您只能使用hql。实际上,您编写的查询应该可以工作。

bkkx9g8r

bkkx9g8r2#

在我的理解中,涉及到您的问题的一个类似问题是如何使用jpa标准api连接不相关的实体。不幸的是,它没有被标记为已解决,但我认为弗拉德米哈尔凯斯的答案是一个,你可能想遵循。
编辑链接问题提供了很多选项:当前hibernate、nativequery或jooq。如果出于任何原因它们都不适合你,那么你的方法也可能奏效。但是,您应该记住,您有真正的onetoone语义,这意味着每个第二个实体只属于一个或零个第一个实体,并且第一个实体引用是唯一的,否则您可能会遇到意外的行为。也许也可以多通Map更合适,根据你的情况,我不知道你的db设计?如果您不能使用遗留数据库来添加真正的约束,您可能还需要告诉hibernate。看看这里的鸡尾酒课https://www.baeldung.com/jpa-query-unrelated-entities

相关问题