用于从 OneToMany 关系中获取不同值的 MySQL 或 JPQL 查询(条件优先级)

Posted

技术标签:

【中文标题】用于从 OneToMany 关系中获取不同值的 MySQL 或 JPQL 查询(条件优先级)【英文标题】:MySQL or JPQL query for getting different values from OneToMany relation (Condition priority) 【发布时间】:2021-08-25 22:11:09 【问题描述】:

我有一个表产品,其中包含诸如

之类的信息
id product_name retailer_name
1 Shirt Gucci

此表与 product_prices 有 OneToMany 连接,其中包含如下信息

id price country product_id
100 95.5 United Kingdom 1
101 97.5 France 1
300 70.9 EUROPEAN_UNION 1

我需要创建一个 mysql 或 JPQL 查询来检索

    产品名称 零售商名称 价格(根据国家或选择欧盟)

例如:如果选择国家英国 -> 那么它 将检索:

    衬衫 Gucci 95.5

如果选择国家意大利 -> 那么它将检索:

    衬衫 Gucci 70.9

如您所说,在第二个示例中,系统检索到 EUROPEAN_UNION 价格,因为找不到意大利。

如果选择国家 EUROPEAN_UNION -> 那么它将检索:

    衬衫 Gucci 70.9

如您所说,在第三个示例中,系统检索到 EUROPEAN_UNION 价格,因为找到了 EUROPEAN_UNION 国家/地区。

我怎样才能做到这一点?

我在 JPQL 中尝试过类似的东西:

select new com.ProductDTOWithPrice(p.id, p.product_name, p.retailer_name, " +
        "pr.price) " +
        "from Product p " +
        "join ProductPrice pr " +
        "where p.id =:productId and (case when pr.country=:country then 1 " +
        "else when pr.country.id = EUROPEAN_UNION then 1 end)"

另外,尝试进行多项选择或使用存在,但我仍然无法弄清楚。我在检索“价格”时遇到了困难。

    select p.id, p.name,
       Max(IF(pp.country_id = :countryId, true, false)) as mainCountry,
       Max(IF(pp.country_id = 400, true, false)) as europeanCountry
from products p
         join product_prices pp on p.id = pp.product_id
where p.id = '0002fb8977754949bf4da70535e1a2e6'
GROUP BY p.id;

有什么帮助吗?

【问题讨论】:

如果有人给你一个jpql方案,另一个人给你一个MySQL方案,你会接受哪一个? 任何,对我来说都无所谓。我更喜欢 JPQL。 @Strawberry ,请问您为什么要删除我的标签?我说我需要 mysql 或 jpql 中的解决方案。这个问题与一对多关系和 if-case-statements 相关 【参考方案1】:

我已经使用 MYSQL 解决了这个问题:

select p.id, p.name, pp.price, country, (CASE
                                                WHEN (pp.country_id = :country) THEN 3
                                                WHEN (pp.country_id = EUROPEAN_UNION) THEN 2                                        
    else 0
    end) as priorityIndex
from products p
         join product_prices pp on p.id = pp.product_id
where p.id  = '0002fb8977754949bf4da70535e1a2e6'
ORDER BY priorityIndex DESC
LIMIT 1;

如果有人知道更好的解决方案,请告诉我

【讨论】:

以上是关于用于从 OneToMany 关系中获取不同值的 MySQL 或 JPQL 查询(条件优先级)的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:具有两个不同的 ManyToOne 关系的子表

Sonata 3:删除 OneToMany 关系中的实体不适用于 'by_reference' => false

Hibernate/JPA:获取 OneToMany 关系的一个(第一个)元素

在 Spring Boot 中使用 JPA 从具有 OneToMany 关系的实体中删除对象

OneToMany 关系中的休眠标准

无法在 HIbernate 4 中保持 OneToMany 关系