使用 JPQL 加入标准

Posted

技术标签:

【中文标题】使用 JPQL 加入标准【英文标题】:Use JPQL to JOIN ON criteria 【发布时间】:2019-10-18 21:50:47 【问题描述】:

我正在使用 JPA 来返回结果集,但是想要排除已删除 = true 的指令(加入到组然后形成)。

我会在命名查询中使用 ON 子句,但它会导致休眠异常,因为我们正在运行的版本不支持它(升级它目前不是一个选项)。此外,JPA 的版本也不允许通过标准构建器完成此操作。

@NamedQuery(name = "Form.findAllForms", query="SELECT DISTINCT f FROM Form f LEFT OUTER JOIN f.instructionGroups g LEFT OUTER JOIN g.instructions i")
// .. ON i.deleted = false
public class Form implements Serializable 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinColumn(name = "form_id", nullable = false)
    @OrderColumn(name = "sortOrder")
    private List<InstructionGroup> instructionGroups = new ArrayList<>();



public class InstructionGroup implements Serializable 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinColumn(name = "instructionGroup_id", nullable = false)
    @OrderColumn(name = "sortOrder")
    private List<Instruction> instructions =  new ArrayList<>();



public class Instruction implements Serializable 

    private boolean deleted;

使用 WHERE 子句也不起作用,因为它不再返回带有已删除指令的表单,因为我需要在连接阶段应用我的条件。我最好的选择是编写本机 SQL 并使用它,还是我可以坚持使用 JPA 来实现这一目标?

【问题讨论】:

看起来你想要的是一个软删除机制,所以虽然这不能直接回答你的问题,但你可能会发现the following link很有用 【参考方案1】:

在查询中使用“WITH”子句来指定 join 的条件。参考下面的查询

query="SELECT DISTINCT f FROM Form f LEFT OUTER JOIN f.instructionGroups g LEFT OUTER JOIN g.instructions i WITH i.deleted=0

【讨论】:

以上是关于使用 JPQL 加入标准的主要内容,如果未能解决你的问题,请参考以下文章

SQL 到 JPQL 加入请求

直接加入 JPA 或 HIBERNATE

JPQL 语句返回布尔值

在 JPQL 中将整数转换为字符串

Atitit oodbms的查询,面向对象的sql查询jpa jpql hql

JPQL 表名未映射