【问题标题】:Can a JPQL JOIN be made not to make multiple SQL queries?可以使 JPQL JOIN 不进行多个 SQL 查询吗?
【发布时间】:2021-12-31 16:20:13
【问题描述】:

以一个常见的业务情况为例,您有一个orders 表,其中有一个created_date 和一个customer_id。您想与相关客户一起阅读本月的所有订单:

@Query("select Q from Order Q join customer C on Q.customer_id=C.id where Q.created_date >= '2021-11-01'")

这可行,但是当我添加到application.properties:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

我惊恐地发现,对于每个订单,都会使用单独的 select 声明重新读取客户详细信息;因此,如果本月有 80 个订单,JPA 系统会执行 81 个select 语句,而不是一个。我明白这在一般情况下可能很难优化,但它使系统对生产毫无用处。是否可以提示 JPA/Spring 以避免额外的 select 语句?

【问题讨论】:

    标签: sql jpa join spring-data-jpa jpql


    【解决方案1】:

    这个答案对我有用并且很有意义。如果您要连接两个表,则结果行是一种新类型,与基础表的行类型不同。所以你必须声明那个类型:

    data class OrderwithCust (
        var orderid: Int,
        var customerid: Int,
        var customerName: String?
    )
    

    然后您可以通过

    获取OrderwithCust 实例列表
    @Query("select new OrderwithCust(Q.id,Q.customer_id,C.name) from Order Q join customer C on Q.customer_id=C.id where Q.created_date >= '2021-11-01'")
    

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2016-01-14
      相关资源
      最近更新 更多