我在我的hibernate映射XML文件中有一个子选择查询(如下所示)。这样做的目的是设置一个基本的SQL查询,然后通过Criteria API添加各种限制。我显示的数据可以进行排序,筛选和搜索,支持页面调整,因此Criteria API对此非常有用。Hibernate子选择Criteria API:MySql性能低下
<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
所以我的问题是如何创建Hibernate中基本的查询,而无需使用子查询,让我使用Criteria API?获取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。