当前位置: 首页 > 面试题库 >

JPA如何加入这些实体

夔宏深
2023-03-14
问题内容

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

  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
)


 类似资料:
  • 在我的pom.xml我有这个: 作为依赖,我有这些: 当我建立我的。jar与mvn clean一起安装,并将其上传到AEM。我看到了: 这些红色的“多余”包裹,它都解决不了的是什么,我该怎么解决? 在我构建软件包并将其上传到AEM之前,如何防止这种情况发生?

  • 我正在使用Spring Boot,JPA和Hibernate。我有以下实体,它与有关: 当我读取一个用户时,Hibernate会为每个附加角色生成一个选择,而不是使用加入。在纯Hibernate中,我将通过添加来解决这个问题 但这似乎没有任何影响。 是否可以为有关此实体的所有查询设置首选提取模式? 我找到的一种解决方法,我真的认为这是一种解决方法,因为我需要为每个查询指定它,是这样的:

  • 问题内容: 我有一个java.sql.Blob的JPA实体: 如何创建该实体的实例?我想设置与方法,但如何让从JPA?只是接口,对于不同的数据库有不同的实现,因此我认为JPA应该给我正确的实现。如何获得? 问题答案: 使用字节数组: 如果要使用流,请使用以下命令创建Blob:

  • 问题内容: 我以为我知道该如何使用,但显然不知道如何使用。谁能帮我? 这给我例外 与拥有OneToMany关系。 我的第二个问题是,说此查询返回唯一的结果,那么如果我这样做 代表上面的查询名称。那么,将其串联在一起还是会得到回报? 问题答案: JPQL中的一对多关系如下所示: 在子句中指定多个属性时,结果返回为: 顺便说一下,为什么您的实体以复数形式命名,这令人困惑。如果要使用复数形式的表名,则可

  • 问题内容: 我对即将要做的索引编制感到有些困惑。 首先,我使用4列索引,如下所示: 索引名称-advanced_query 索引中将使用列-标题,类别1,类别2,类别3 索引代码 好的,这就是它的工作方式(据我了解): 标题 查询将使用索引。 cat_1 查询将使用索引。 cat_2 查询将使用索引。 cat_3 的查询将 不 使用索引。因此,我将为其创建一个不同的索引。 查询 标题cat_1 将