小编典典

JPA如何加入这些实体

java

给定下面的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;

 }

如果缺少任何内容,请发表评论,而不是关闭或拒绝该问题!


阅读 263

收藏
2020-11-30

共1个答案

小编典典

基本上:

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)仅使用基本过滤器和以下表达式来重写您的问题:

  1. “存在一些……条件成立”
  2. “对于所有…条件为真”

b)翻译:

  1. 这种情况成为 exists (select ... where condition)
  2. 这种情况成为 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
)
2020-11-30