给定下面的JPA实体,我想获取 具有至少一个成功状态的“请求”的所有借方。
可能有许多请求具有相同的debit_id和不同的状态
我应该使用这样的东西还是有更好的做事方法
entityManager.createQuery(“从借方d连接d.id中选择c,其中request.status =成功”
@Entity(name = "T_DEBIT") public class Debit { public enum Status { NEW, OLD } @Column(name = "STATUS", nullable = false, length = 20) @Enumerated(value = EnumType.STRING) private Status status; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID") private Long id; @ManyToOne(optional = false) @JoinColumn(name = "ACCOUNT_ID", updatable = false, nullable = false) private Account account; }
而其他实体是
@Entity(name = "T_REQUEST") public class Request{ public enum Status { PENDING, FAILED, SUCCESFUL} @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID") private Long id; @ManyToOne(optional = false) @JoinColumn(name = "DEBIT_ID", updatable = false, nullable = false) private Debit debit; @Column(name = "STATUS", nullable = false, length = 20) @Enumerated(value = EnumType.STRING) private Status status; }
如果缺少任何内容,请发表评论,而不是关闭或拒绝该问题!
基本上:
select d from T_DEBIT d where exists ( select r from T_REQUEST r where r.debit.id = d.id and r.status = SUCCESSFUL )
检查JPQL中的枚举语法,我通常不对实体使用枚举,在此示例中可能是错误的。
作为一种样式问题,我将使用实体名称==类名称而不是实体名称==表名称。它使得JPQL 不是 SQL更清晰的事实
更新
Spring要求解决类似问题。解决这些问题的方法非常系统化:
a)仅使用基本过滤器和以下表达式来重写您的问题:
b)翻译:
exists (select ... where condition)
not exists (select ... where NOT condition)
在Spring的特定问题中,“排除所有成功请求”,目标不是很明确。如果他/她的意思是“在没有成功请求的情况下获得所有借方”,那么您应该这样做:
a)将问题改写为“获取所有借方,以便 对于所有关联的请求,请求状态都不为SUCCESSFUL ”。b)翻译为
select d from T_DEBIT d where not exists ( select r from T_REQUEST r where -- This is the join condition, so it should not be negated r.debit.id = d.id and -- This is the actual filtering condition, negate as this is a FOR ALL not (r.status != SUCCESSFUL) )
然后,您可以简化最后一个条件,得到:
select d from T_DEBIT d where not exists ( select r from T_REQUEST r where r.debit.id = d.id and r.status = SUCCESSFUL )