【问题标题】:Selecting where an entity contains a list thats a subset of another list选择一个实体在哪里包含一个列表,该列表是另一个列表的子集
【发布时间】:2011-06-06 00:42:57
【问题描述】:

我正在编写一个 JPQL 查询并且我有以下场景。我有一个包含标签列表的问题实体。我想选择包含给定标签列表的所有问题。我如何使用 JPA 做到这一点?

我想做一些类似 SELECT x FROM Question x WHERE x.tags 'contains all' :tags 的事情

【问题讨论】:

    标签: jpa jpql


    【解决方案1】:

    [这会搜索 ANY not ALL;请参考其他正确答案。]

    您可以将列表设置为参数。

    SELECT x FROM Question x WHERE x.tags IN :tags
    

    也可以尝试使用 (:tags),因为它取决于您使用的 JPA 实现。

    【讨论】:

    • 我稍后会对此进行测试。我知道如果要检查一个标签是否在标签列表中,它会起作用。但现在我的情况涉及测试标签列表是否是另一个标签列表的子集。
    • 不起作用。它返回一个“问题”,其中“标签”包含“x.tags”中的任何元素。
    • 这个不行,连sqlprepare检查都没通过。
    【解决方案2】:

    试试这样:

    select distinct q from Question q join q.tags as t 
    where t.name in (:tags) 
    group by q.id, q.author, q.title, q.content,q.postedAt 
    having count(t.id) = :size
    

    【讨论】:

    • 这个答案对我使用 MySQL 有效。 @nayan-wadekar 的答案是给出 sql 语法异常。
    【解决方案3】:

    Nayans 解决方案对我不起作用。它选择与给定集合':tags'的第一个(或任何?)条目匹配的每个'x'。如果这真的对您有用,您应该再次测试您的应用程序;) 可能依赖于 JPA - 我不知道。

    提示:尝试 Krzysztofs 解决方案或使用我的解决方案:

    SELECT x FROM Question x 
    WHERE x IN (
        SELECT y FROM Question y
        INNER JOIN y.tags yt
        WHERE yt IN (
            :tags
        )
        GROUP BY y
        HAVING COUNT( DISTINCT yt) = (
            :tagsSize // should be clear ;)
        )
    )
    

    【讨论】:

    • 标签大小检查不能被您需要两个标签所欺骗。问题有两个但只匹配一个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多