使用 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 加入标准的主要内容,如果未能解决你的问题,请参考以下文章