在没有表扫描的情况下组合Hibernate查询

时间:2015-10-20 21:43:58

标签: java mysql hibernate

一些背景知识 - 我在Hibernate 3.5上(最重要的是,它没有工会。)我有项目,我有标签。标签作为集存储在Items中。我正在尝试编辑我们的数据库搜索组件,以便我可以通过字符串搜索项目,该字符串可以是项目的名称或标记的名称。实际上,我有两个问题:

select a from Item a where a.name = :searchString;
select a from Item a join a.tags t where t.name = :searchString;

我能把它们组合起来的最明显的方法是:

select a from Item a where a.name = :searchString or a.id in (select b.id from Item b join b.tags t where t.name = :searchString);

这会产生正确的结果 - 但是,它生成的SQL会导致MySQL数据库对Item执行全表扫描。各个查询都没有这样做 - 它是添加导致扫描的“in”子句。对于我来说,做两个单独的hql选择并在结果集上的Java代码中执行“穷人的联合”可能并不理想,因为它需要对我们的搜索功能进行全面的代码更改。但是,如果无法访问工会,我会因为其他方式来组合查询而感到茫然。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你不能只使用left outer join tags和OR留下不同的值吗?喜欢这个

select distinct a 
from Item a left outer join a.tags t 
where t.name = :searchString or a.name=:searchString;