我的休眠映射 XML 文件中有一个子选择查询(如下所示)。这样做的目的是设置一个基本的 SQL 查询,然后通过 Criteria API 添加各种限制。我正在显示可以在支持分页的情况下进行排序、过滤和搜索的数据,因此 Criteria API 对此非常有用。
<class name="className" table="tableName">
<subselect>
select x.col1 AS ID,
c.col2 AS a
....
from table1 x,
table2 y
where x.id = y.id
....
....
</subselect>
<id name="ID" column="ID"/>
<property name="a" column="a"/>
...
...
</class>
然后Java代码将通过执行类似的操作来添加限制
标准 c = sessionFactory.getCurrentSession().createCriteria(tableName.class); c.add(Restrictions.allEq(m)); // 其中 m 是包含列过滤器的哈希图
但是,似乎使用 subselect 来声明基本查询导致 MySQL 的性能非常差。Hibernate 将基本查询放入一个子查询中,该子查询位于具有附加限制的外部查询的 FROM 子句中。因此,为了清楚起见,Hibernate 创建了一个类似 A 的查询,而我想要的查询是 B,即我不想要一个子查询,因为它会降低性能。
A: select _tmp.* B: select t1.col1,
from ( t1.col2
select t1.col1, from table1 t1,
t1.col2 table2 t2
from table1 t1, where t1.id = t2.id
table2 t2 and t1.col1 = 'blah'
where t1.id = t2.id order by t1.col desc
...
) _tmp
where _tmp.col1 = 'blah'
order by _tmp.col2 desc
所以我的问题是如何在不使用允许我使用 Criteria API 的子选择的情况下在 Hibernate 中创建基本查询?让 Hibernate 运行查询 B 而不是查询 A 的最佳方法是什么?
我知道我可以在映射文件中创建命名查询并加载它们,但这会加载一个查询,虽然允许我添加某些限制,但它不如 Criteria 好,因为它不允许排序选项等。 ..
除了使用任何一个之外,还有其他选择吗
<hibernate-mapping>
<class name="" table="">
<subselect></subselect>
</class>
</hibernate-mapping>
or
<hibernate-mapping>
<sql-query name="">
<return-scalar column="col" type="string"/>
</sql-query>
</hibernate-mapping>
因为第一个选项通过使用子查询降低了性能,而第二个选项不允许我(据我所知?)使用 Criteria API 。