0

鉴于下面的 JPA 实体,我想获取所有具有至少一个成功状态的请求的借记。

可以有许多具有相同 debit_id 和不同状态的请求

我应该使用这样的东西还是有更好的做事方式

entityManager.createQuery("select c from Debit d join d.id where request.status =Succesful"

@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;

 }

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

4

1 回答 1

2

基本上:

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) 将问题改写为“获取所有借方,以便对于所有关联的请求,请求状态不成功”。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
)
于 2013-05-29T08:22:07.103 回答