Hibernate或SQL Query M-N成员的收藏?

时间:2015-01-08 17:55:10

标签: java sql database hibernate jpa

给定一个具有@ElementCollection字符串的类,并给出一个字符串的输入集合:

public class FooBar {
   @ElementCollection
   private Set<String> tags
}

Set<String> queryTags;

如何查询以下两种情况:

  1. 返回所有FooBar fb,其中queryTags在fb.tags中至少有一个匹配
  2. 返回所有FooBar fb,其中queryTag中的所有字符串都与fb.tags中的元素匹配(queryTag是fb.tags的子集合)
  3. 注意:我不会问两个集合是否相等。

    显然,我可以查询所有并在代码中执行集合比较,或者我可以这样做:

    for(String tag : queryTags){
       createQuery("from FooBar fb where :t member of fb.tags").setString("t", tag)
    }
    

    这两种方式看起来都非常低效,但我不知道vanilla SQL或HQL是否支持对集合的任何查询支持

1 个答案:

答案 0 :(得分:1)

  1. select fb 
    from FooBar fb 
    left join fb.tags t
    where t in ( :queryTags )
    
  2. select fb 
    from FooBar fb 
    where fb.id not in (
        select id
        from FooBar
        left join tags t
        where t not in ( :queryTags )
    )
    
  3. queryTags的设置位置为:

    session.createQuery(queryString).setParameterList( "queryTags ", queryTags ).list();