Пересечь в JpaRepository - PullRequest
       7

Пересечь в JpaRepository

0 голосов
/ 21 ноября 2018

У меня SQL-запрос, как показано ниже.Я хотел бы взять общий product_id, authorization_ids для определенных merchantIds.В этом примере продавец 20000 имеет продукт1, авторизацию1 и продукт2, авторизацию1, тогда как у других продавцов есть только продукт1, авторизация 1.

SELECT product_id,authorization_id  FROM ACQ_MERCHANT_PRODUCT_AUTH  WHERE merchant_Id = 20000
Intersect 
SELECT product_id,authorization_id  FROM ACQ_MERCHANT_PRODUCT_AUTH  WHERE merchant_Id = 20001
Intersect 
SELECT product_id,authorization_id  FROM ACQ_MERCHANT_PRODUCT_AUTH  WHERE merchant_Id = 20002

Приведенный выше запрос дает правильный результат, который является продуктом1, авторизация1.Я пытаюсь реализовать это в jpa:

@Repository
public interface MerchantProductAuthorizationRepository extends 
JpaRepository<MerchantProductAuthorizationEntity, Long> {

    @Query("SELECT new com.ykb.acq.application.sweep.util.ProductAuthMap(m.product.id, m.authorization.id) FROM MerchantProductAuthorizationEntity m WHERE m.merchantId IN (:merchants) GROUP BY  m.product.id, m.authorization.id")    
    List<ProductAuthMap> findIntersactionOfProductAndAuthorizations(@Param("merchants") Set<Long> merchants);

}

Но это дает мне больше линий, чем пересечение.(продукт1, авторизация1 и продукт2, авторизация2)

Как получить тот же результат?

1 Ответ

0 голосов
/ 22 ноября 2018

Ваш HQL не имел пересекающейся логики по merchantIds.В этом случае я считаю, что merchant_id сгруппирован по (m.product.id, m.authorization.id), и если количество равно количеству продавцов, то эта пара (m.product.id, m.authorization.id) находится во всехТорговый набор.

SELECT new com.ykb.acq.application.sweep.util.ProductAuthMap(m.product.id, m.authorization.id) FROM MerchantProductAuthorizationEntity m WHERE m.merchantId IN (:merchants) GROUP BY  m.product.id, m.authorization.id having count(distinct m.merchantId) =:merchantsCount
...