gpt4 book ai didi

mysql - 使用 Criteria API : slow performance in MySql 的 Hibernate 子选择

转载 作者:行者123 更新时间:2023-11-29 00:41:57 25 4
gpt4 key购买 nike

我的 hibernate 映射 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 代码将通过执行以下操作来添加限制

Criteria c = sessionFactory.getCurrentSession().createCriteria(tableName.class);c.add(Restrictions.allEq(m));//其中 m 是包含列过滤器的 HashMap

但是,似乎使用子查询来声明基本查询会导致 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。

最佳答案

我有一个解决方案,所以我在这里添加它以供引用。

我的要求是使用 Hibernate 从多个表中检索数据并使用 Criteria API 过滤结果集。作为 Hibernate 和 Criteria 的新手,我选择了当时我认为最简单的选项,即手工制作一些原始 SQL 以将数据拉到一起并使用 Criteria 过滤该数据。 subselect 的使用是我当时唯一知道的加载手工制作的 SQL 语句以供 Criteria 函数进一步修改的方法。这在功能方面运行良好,但如上所述,在针对 MySQL 运行时表现非常差。

我没有意识到我可以用 Criteria 做的是使用别名来限制关联。所以我放弃了原始 SQL,使用 Hibernate 检索我的父数据对象,并使用 Criteria Aliases 对所有必需的关联添加限制。与 5 秒相比,此方法的执行时间不到 100 毫秒。

关于mysql - 使用 Criteria API : slow performance in MySql 的 Hibernate 子选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com