【问题标题】:JPQL where clause with collection in collectionJPQL where 子句与集合中的集合
【发布时间】:2018-02-12 03:16:17
【问题描述】:

我使用弹簧数据...并且我有一个具有多对多关系的实体。

所以我想做这样的请求:

@Query("SELECT d FROM Data d WHERE ((?2) IS NULL OR d.categories IN (?2))")

其中?2 对应一个列表,categories 也是来自Data 的(另一个实体的)列表。

但这不起作用......有什么想法吗? :)

PS:我看到了一个解决方案:

@Query("SELECT r FROM Data r WHERE (?3 = 0L OR ?3 = (SELECT COUNT(cate.id) FROM Data r2 JOIN r2.categories cate WHERE r.id = r2.id AND cate IN ?2 ))")

但这是由 hibernate 生成的糟糕请求,并不是我想要的......

【问题讨论】:

    标签: java sql spring hibernate jpql


    【解决方案1】:

    看看这是否有效

    @Query("SELECT DISTINCT(d) FROM Data d JOIN d.categories c 
    WHERE (COALESCE(?2, NULL) IS NULL OR c.id IN (?2))")
    
    1. 这里我假设 id 是类别表中的主键字段。您可以根据自己的情况进行修改。
    2. 您将在此处将类别 ID 列表作为参数传递。

    如果 ?2 为空,上述查询将从数据表中检索所有记录,否则它将根据您将作为 ?2 传递的类别 ID 列表进行过滤。

    【讨论】:

    • @JMA 我已经测试了上面的代码,它正在使用 JPA 2.1
    • 感谢您的回答...但我现在需要添加一些复杂性!事实上,我使用带有 JpaSort.unsafe 的 spring 动态地使用“order by”。我使用不安全的方法,因为我需要对计算值进行排序(例如:SIZE(d.saws),其中 d.saws 也是一个集合)所以 distinct 不起作用^^
    【解决方案2】:

    您应该使用两个查询。一种当参数为空时检索所有数据,另一种当参数不为空时检索过滤后的数据。

    【讨论】:

    • @Query("SELECT d FROM Data d WHERE d.categories IN (?2)) 不起作用:)
    • 不应该(?2)?2 吗?再说了,你为什么从2开始?
    • 这只是因为它是一个例子......它不是我的直接代码:) sry ^^
    【解决方案3】:

    我认为你应该更好地分解复杂性。 有一个 java 帮助:) containstAll() 方法对你没有帮助吗?

    P.S:Hibernate 是否理解 (?2) IS NULL 并且适合您?

    【讨论】:

    • 是的,它的工作:) 我不想对数据库执行复杂的操作,因为它对性能更好:)
    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多