Hibernate Named Query копирование-вставка - PullRequest
1 голос
/ 19 февраля 2011

В моем .hbm.xml есть два запроса.Первый извлекает количество записей в таблице:

<query name="Airframe.SearchCount"><![CDATA[
    select
        count(*)
    from
        AirframeBean as a inner join
        a.manufacturer as m
    where
        m.name like :manufacturer and
        a.description like :description and
        ((a.percentSize <= :sizeMax and
        a.percentSize >= :sizeMin) or
        a.percentSize is null) and
        ((a.wingSpanInches <= :spanMax and
        a.wingSpanInches >= :spanMin) or
        a.wingSpanInches is null) and
        ((a.recommendedAuwMinLbs <= :auwMax and
        a.recommendedAuwMaxLbs >= :auwMin) or
        a.recommendedAuwMaxLbs is null)
]]></query>

А второй получает данные постранично, используя смещение и предел:

<query name="Airframe.SearchData"><![CDATA[
    select
        a
    from
        AirframeBean as a inner join
        a.manufacturer as m
    where
        m.name like :manufacturer and
        a.description like :description and
        ((a.percentSize <= :sizeMax and
        a.percentSize >= :sizeMin) or
        a.percentSize is null) and
        ((a.wingSpanInches <= :spanMax and
        a.wingSpanInches >= :spanMin) or
        a.wingSpanInches is null) and
        ((a.recommendedAuwMinLbs <= :auwMax and
        a.recommendedAuwMaxLbs >= :auwMin) or
        a.recommendedAuwMaxLbs is null)
]]></query>

Запросы практически идентичны,единственное отличие состоит в том, что первый начинается с select count(*), а второй начинается с select a.Есть ли способ избежать вставки копий?

Обновление Основная проблема заключается в том, что мне нужен Hibernate для проверки схемы, сопоставлений и запросов HQL при запуске.

Ответы [ 4 ]

4 голосов
/ 19 февраля 2011

Вы можете сделать что-то вроде этого: -

Именованный запрос

#SELECTOR# - это заполнитель, который должен заменить ваш Java-код.

<query name="Airframe"><![CDATA[
    select
        #SELECTOR#
    from
        AirframeBean as a inner join
        a.manufacturer as m
    where
        m.name like :manufacturer and
        a.description like :description and
        ((a.percentSize <= :sizeMax and
        a.percentSize >= :sizeMin) or
        a.percentSize is null) and
        ((a.wingSpanInches <= :spanMax and
        a.wingSpanInches >= :spanMin) or
        a.wingSpanInches is null) and
        ((a.recommendedAuwMinLbs <= :auwMax and
        a.recommendedAuwMaxLbs >= :auwMin) or
        a.recommendedAuwMaxLbs is null)
]]></query>

Код гибернации

public Long searchCount() {
    String sql = getQueryString("Airframe").replace("#SELECTOR#", "count(*)");
    return (Long) session.createSQLQuery(sql, args...).uniqueResult();
}

@SuppressWarnings("unchecked")
public List<AirframeBean> getAirframeBeans() {
    String sql = getQueryString("Airframe").replace("#SELECTOR#", "a");
    return session.createSQLQuery(sql, args...).list();
}

private String getQueryString(String namedQuery) {
    return session.getNamedQuery(namedQuery).getQueryString();
}
1 голос
/ 19 февраля 2011

Одна идея, если вы решите перейти на персистентность на основе программ / аннотаций.Если у вас есть запросы в виде строковых запросов java HQL или DetachedStatement, продвижение повторного использования - это очень просто.Рассмотрим сценарий использования HQL, где вы можете достичь желаемого эффекта с помощью:

String hql = ... 
hql = hql.replace("count(*)", "a");

В качестве альтернативы:

String hql = "from ...";
String q1 = "select count(*) " + hql;
String q2 = "select a " + hql;

См. Также Как этот SQL-запрос в hbm.xmlфайл можно записать в исходном коде?

0 голосов
/ 19 февраля 2011

Criteria API - это другой способ создания запроса в спящем режиме, особенно полезный для разбивки на страницы.

Пример использования кода:

      
  Criteria crit = session.createCriteria(AirframeBean.class);
  crit.add(Restrictions.like("name", "manufacturer"));
  crit.add(Restrictions.like("description", "yourDescription"));
  crit.add(Restrictions.between("percentSize", "sizeMin", "sizeMax"));

  ecc....

  crit.setMaxResults(maxResults);
  crit.setFirstResult(firstResult);
  List result = crit.list()

Для добавления условия И или ИЛИ вы можете использовать: Restrictions.disjunction ();или Restrictions.conjunction ();

Таким образом, вы используете только Java-код и не XML-файл для управления и составления динамического запроса.

0 голосов
/ 19 февраля 2011

Другая идея заключается в использовании Criteria API для управления нумерацией страниц вместо именованных запросов. С Hibernate Criteria API вы можете использовать методы setFirstResult () и setMaxResult (), чтобы определить группу данных для загрузки для таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...