【问题标题】:JPQL - Select cars rented by more than 10 different customersJPQL - 选择由 10 多个不同客户租用的汽车
【发布时间】:2019-01-25 20:15:20
【问题描述】:

我有 3 个实体:汽车、租赁和客户。 租赁与汽车和客户有关。

我需要编写查询来查找超过 10 个不同客户租用的汽车

以下代码:

@Override
    public List<CarEntity> findCarsRentedByDifferentCustomers() {

        TypedQuery<CarEntity> query = entityManager.createQuery(
        "SELECT car FROM CarEntity car join car.rentals cr " +
                "WHERE(SELECT COUNT(re) FROM RentalEntity re " +
                "join re.customer c " +
                "GROUP BY c.id) > 10", CarEntity.class
        );

        return query.getResultList();
    }

我总是收到DataIntegrityViolationException 或InvalidDataAccessApiUsageException。我已经尝试过以多种不同的方式编写此查询。

【问题讨论】:

  • 我认为这里真正的问题是您的查询,而不是 JPQL。在这里查看一些表/实体结构以及示例数据会有所帮助。

标签: mysql spring jpql


【解决方案1】:

查询可以更像下面的查询。
内部查询与 Rental 表中的 car_id 匹配,并检查是否有超过 10 个唯一客户租用了一辆唯一的汽车。

请注意,您可能需要将查询更改为使用您正在使用的正确表列。
您没有提供表结构和示例数据。

SELECT 
 Car.*
FROM
 Car
WHERE
 Car.id IN (

  SELECT 
   Rental.car_id
  FROM 
   Rental 
  GROUP BY 
   Rental.car_id
  HAVING 
   COUNT(DISTINCT Rental.customer_id) > 10
)

【讨论】:

    【解决方案2】:

    在标准 SQL 中,查询如下所示:

    SELECT cr.car
    FROM car.rentals cr 
    GROPU BY cr.car
    HAVING COUNT(DISTINCT re.customer) >= 10;
    

    【讨论】:

      【解决方案3】:

      use.agregate函数sql代码如下

         select c.id  from car c inner join
          rentals r on      c.rentalid=r.rentalid
          group by c.id 
          having count(distinct customerid)>10
      

      【讨论】:

        【解决方案4】:

        错误是我试图按 customer.id 而不是 car.id 进行分组,我试图在 jpql 查询语法中找到一个错误。 现在我的代码看起来像:

        @Override
            public List<CarEntity> findCarsRentedByDifferentCustomers() {
        
                TypedQuery<CarEntity> query = entityManager.createQuery(
                "select car from CarEntity car " +
                        "where car.id in (select re.car.id from RentalEntity re " +
                        "group by re.car.id " +
                        "having count(distinct re.customer.id) > 10)", CarEntity.class
                );
        
                return query.getResultList();
            }
        

        @Raymond Nijland、@Zaynul Abadin Tuhin 谢谢你的回答

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-07
          • 2018-07-25
          • 1970-01-01
          • 2021-08-20
          • 1970-01-01
          • 2023-01-14
          • 1970-01-01
          • 2012-09-07
          相关资源
          最近更新 更多