gpt4 book ai didi

java - 我可以在 JPA 中创建此查询而不使用 native 查询吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:09:47 24 4
gpt4 key购买 nike

我想使用 JPA 存储库创建此查询。我怎样才能做到这一点?我的问题是我无法在实体管理类中获取 COUNT(1) 。我不想使用 native 查询@Query。

     SELECT distinct COUNT(1) as count, reject_cd FROM TXN_RESP_PRICE_REJECT rej 
GROUP BY rej.reject_cd FETCH FIRST 10 ROWS ONLY

这是实体类的顶部部分,没有 setter 和 getter。

          @Entity
@Table(name = "txn_resp_price_reject")
public class TxnRejectDTO {
@Id
private String rejectCd;
private String count;

public TxnRejectDTO() {
}
}

最佳答案

我认为你想做的事情是不可能的......即使是,我也不会推荐它......

ORM(对象关系映射)的目的是将您的 Java 代码映射为关系数据库可以理解的内容。基本上,您可以将表的列转换为类的属性。

在这里,您尝试做一些更复杂的事情:您将带有聚合函数(计数)的查询内容映射到 java 对象中...但没有要映射的列。

我认为您正在经历我所说的“创伤后 JPA 综合症”:基本上,您认为 JPA 将统治世界,而您看不到自己编写 SQL 查询的意义。你对 SQL 有点过敏:)

在您的情况下,您不是映射表,而是映射查询的结果。这不是 ORM 的用途。

这里有 2 个解决方案。

查询 + JPA 映射您的表

您的 TxnRejectDTO 未映射一张表,因此,您应该删除注释。您可以创建另一个映射表“TXN_RESP_PRICE_REJECT”的对象:TxnRespProceReject。像这样的事情:

@Entity
@Table(name = "txn_resp_price_reject")
public class TxnRespPriceReject {
@Id
private String rejectCd;
private String aColumn;

public TxnRespPriceReject() {
}

// generate setters and getters

}

并创建一个存储库来访问您的数据。 Spring 将能够将您的Repository“绑定(bind)”到您的Entity。在此添加您的查询以检索您的 TxnRejectDTO :

public interface TxnRejectPriceRejectRepository extends CrudRepository< TxnRespPriceReject, Long> {
@Query("SELECT new your.package.TxnRejectDTO(rejectCd, count(t)) FROM TxnRejectPriceReject t GROUP BY t.rejectCd")
public List<TxnRejectDTO> findTxnReject();
}

请注意构造函数(与包一起)的完全限定名称的使用。
同时,通过删除与 Hibernate 相关的注释并使用所有参数构造函数,使 TxnRejectDTO 成为一个简单的 bean。

public class TxnRejectDTO {
private String rejectCd;
private String count;

public TxnRejectDTO(String rejectCd, Long count) {
this.rejectCd = rejectCd;
this.count = count;
}
}

应该可以...但不确定这是否是您想要的。这是一个很好的链接:How to return a custom object from a Spring Data JPA GROUP BY query

不带查询的 JPA

那么,如果您对 Java 代码中的 SQL 非常过敏,为什么不使用 View 呢?

  1. 在数据库中创建 View
CREATE VIEW txn_reject AS SELECT reject_id, count(1) as count from TXN_RESP_PRICE_REJECT rej GROUP BY rej.reject_cd FETCH FIRST 10 ROWS ONLY
  • 将您的 TxnRejectDTO 映射到您的 View
  • @Entity
    @Table(name = "txn_reject")
    @Immutable // To let Spring know it won't need to update it (lighter, no cache...)
    public class TxnRejectDTO {
    @Id
    private String rejectCd;
    private String count;

    public TxnRejectDTO() {
    }
    }

    然后声明一个存储库来访问您的实体:

    public interface TxnRejectDTORepository extends CrudRepository<TxnRejectDTO, Long> {
    // the method findAll is provided, so you can get everything you need.
    }

    以下是此解决方案的链接:https://thoughts-on-java.org/hibernate-tips-map-view-hibernate/

    希望对你有帮助!

    关于java - 我可以在 JPA 中创建此查询而不使用 native 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59792817/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com