Я выполняю поиск по одной из моих таблиц (устаревшая база данных) и получаю здесь ужасное время. Запрос строится по критериям API API Hibernate, например ::100100
Criteria crit = getSessionFactory().getCurrentSession().createCriteria(P1.class);
crit.add(Restrictions.sqlRestriction("{alias}.compno like ?", "%" + s + "%", new StringType()));
crit.setMaxResults(25);
crit.setFirstResult(0);
crit.addOrder(Order.asc("compno"));
crit.list();
Как вы видите, я уже делаю пейджинг здесь, чтобы улучшить производительность. Для этого критерия в среднем требуется ~6 seconds
.
Ну, нативный запрос, который выглядит так
select * from SCHEM.P1 where compno like '%100%' order by compno fetch first 25 rows only
занимает всего 10 ms
, что огромная разница, imo. Почему критерии работают так медленно? Нужно ли переключаться обратно на собственный SQL-запрос?
Хороший комментарий к комментариям:
Да, есть некоторые отношения, которых у меня не было в сфере:
<set name="pI" table="P12" lazy="false">
<key column="awcompno" update="false" />
<one-to-many class="org.gee.hibernate.P12" not-found="ignore"/>
</set>
<one-to-one name="info" class="org.gee.hibernate.P13" />
<set name="ma" table="P03" lazy="true" schema="SCHEMP" mutable="false" >
<key column="macountry" property-ref="land" update="false" />
<one-to-many class="org.gee.hibernate.P03" not-found="ignore" />
</set>
<set name="users" table="P15" lazy="true">
<key column="apcompno" update="false" />
<one-to-many class="org.gee.hibernate.P15" not-found="ignore"/>
</set>