休眠联盟替代方案
使用休眠实现联合查询有哪些替代方法?我知道休眠目前不支持联合查询,现在我看到的创建联合的唯一方法是使用视图表。
另一种选择是使用普通的jdbc,但这样我就会失去所有的示例/条件查询好东西,以及休眠对表/列执行的休眠映射验证。
使用休眠实现联合查询有哪些替代方法?我知道休眠目前不支持联合查询,现在我看到的创建联合的唯一方法是使用视图表。
另一种选择是使用普通的jdbc,但这样我就会失去所有的示例/条件查询好东西,以及休眠对表/列执行的休眠映射验证。
您可以使用id in (select id from ...) or id in (select id from ...)
例如,代替非工作
from Person p where p.name="Joe"
union
from Person p join p.children c where c.name="Joe"
你可以做
from Person p
where p.id in (select p1.id from Person p1 where p1.name="Joe")
or p.id in (select p2.id from Person p2 join p2.children c where c.name="Joe");
至少使用MySQL,您以后会遇到性能问题。有时,在两个查询上进行穷人的联接会更容易:
// use set for uniqueness
Set<Person> people = new HashSet<Person>((List<Person>) query1.list());
people.addAll((List<Person>) query2.list());
return new ArrayList<Person>(people);
通常,执行两个简单查询比执行一个复杂查询更好。
编辑:
举个例子,下面是来自子选择解决方案的结果MySQL查询的CONSEPLOSE输出:
mysql> explain
select p.* from PERSON p
where p.id in (select p1.id from PERSON p1 where p1.name = "Joe")
or p.id in (select p2.id from PERSON p2
join CHILDREN c on p2.id = c.parent where c.name="Joe") \G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: a
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 247554
Extra: Using where
*************************** 2. row ***************************
id: 3
select_type: DEPENDENT SUBQUERY
table: NULL
type: NULL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: NULL
Extra: Impossible WHERE noticed after reading const tables
*************************** 3. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: a1
type: unique_subquery
possible_keys: PRIMARY,name,sortname
key: PRIMARY
key_len: 4
ref: func
rows: 1
Extra: Using where
3 rows in set (0.00 sec)
最重要的是,1.row 不使用任何索引,并考虑 200k+ 行。坏!执行此查询花费了 0.7 秒,其中两个子查询都在毫秒内。
使用视图。可以使用实体名称将相同的类映射到不同的表/视图,因此您甚至不会有太多的重复。在那里,这样做,工作正常。
普通 JDBC 还有另一个隐藏的问题:它不知道 Hibernate 会话缓存,因此,如果某些内容被缓存到事务结束,并且没有从 Hibernate 会话中刷新,JDBC 查询将无法找到它。有时可能会非常令人费解。