【问题标题】:Use JPQL to JOIN ON criteria使用 JPQL 加入标准
【发布时间】: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很有用

标签: java hibernate jpa persistence jpql


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 2011-08-27
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2011-07-20
    • 2018-03-13
    • 2010-09-16
    相关资源
    最近更新 更多