Hibernate 或 SQL 查询集合的 M-N 成员?
Hibernate or SQL Query M-N member of with collections?
给定一个 class,它有一个字符串的 @ElementCollection,并给定一个字符串的输入集合:
public class FooBar {
@ElementCollection
private Set<String> tags
}
Set<String> queryTags;
如何查询以下两种场景:
- 返回所有 FooBar fb,其中 queryTags 在 fb.tags
中至少有一个匹配项
- 返回所有 FooBar fb,其中 queryTag 中的所有字符串都匹配 fb.tags 中的元素(queryTag 是 fb.tags 的子集合)
注意:我不是在问两个集合是否相等。
显然,我可以在代码中查询所有并执行集合比较,或者我可以这样做:
for(String tag : queryTags){
createQuery("from FooBar fb where :t member of fb.tags").setString("t", tag)
}
这两种方式看起来都非常低效,但我不知道 vanilla SQL 或 HQL 是否支持对集合的任何查询支持
select fb
from FooBar fb
left join fb.tags t
where t in ( :queryTags )
select fb
from FooBar fb
where fb.id not in (
select id
from FooBar
left join tags t
where t not in ( :queryTags )
)
其中 queryTags 设置为:
session.createQuery(queryString).setParameterList( "queryTags ", queryTags ).list();
给定一个 class,它有一个字符串的 @ElementCollection,并给定一个字符串的输入集合:
public class FooBar {
@ElementCollection
private Set<String> tags
}
Set<String> queryTags;
如何查询以下两种场景:
- 返回所有 FooBar fb,其中 queryTags 在 fb.tags 中至少有一个匹配项
- 返回所有 FooBar fb,其中 queryTag 中的所有字符串都匹配 fb.tags 中的元素(queryTag 是 fb.tags 的子集合)
注意:我不是在问两个集合是否相等。
显然,我可以在代码中查询所有并执行集合比较,或者我可以这样做:
for(String tag : queryTags){
createQuery("from FooBar fb where :t member of fb.tags").setString("t", tag)
}
这两种方式看起来都非常低效,但我不知道 vanilla SQL 或 HQL 是否支持对集合的任何查询支持
select fb from FooBar fb left join fb.tags t where t in ( :queryTags )
select fb from FooBar fb where fb.id not in ( select id from FooBar left join tags t where t not in ( :queryTags ) )
其中 queryTags 设置为:
session.createQuery(queryString).setParameterList( "queryTags ", queryTags ).list();