Общие дао-методы, использующие критерии гибернации, неверны, но это так - PullRequest
4 голосов
/ 23 февраля 2012

В настоящее время у меня есть один дао, который использует универсальные методы и критерии гибернации для выполнения почти всего моего доступа к данным (я планировал создать подкласс для более сложных вещей позже), это выглядит так:

public <T> List<T> getAll(final Class<T> type){
    final Session session = sessionFactory.getCurrentSession();
    final Criteria crit = session.createCriteria(type);
    return crit.list();
}

public <T> List<T> getFieldEq(final Class<T> type, final String propertyName, final Object value){
    final Session session = sessionFactory.getCurrentSession();
    final Criteria crit = session.createCriteria(type);
    crit.add(Restrictions.eq(propertyName, value));
    return crit.list();
}

Однако HQL предпочтительнее, так как он может быть оптимизирован базой данных / соединением (то есть параметризованными запросами), в то время как критерии api должны оцениваться во время выполнения, поэтому Restrictions.eq("name", "NimChimpksy") вообще не безопасен для ошибок.

Должен ли я сохранить общий дао (приятно иметь только один дао) или просто реализовать общий интерфейс и использовать hql в отдельном дао для каждого из моих доменных объектов.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Честно говоря, я не вижу проблем с вашим текущим подходом, если предположить, что ваши запросы настолько просты и понятны.

Обычно, по крайней мере в моей команде, выбор использования HQL против критериев более"предпочтения" вещь.HQL больше похож на SQL, и вы можете написать более сжатый код.Критерии выглядят более понятными для некоторых разработчиков.

В моем случае я склонен использовать HQL, поскольку он позволяет мне писать более короткий и понятный код для сложных запросов (опять же, я считаю, что это действительно вопрос предпочтений),Тем не менее, критерии также могут быть очень полезны, потому что они позволяют на лету создавать условия запроса намного проще, чем HQL, вот очень простой пример: -

public void doIt(String s1, String s2, String s3){
    ...

    if (/*some s1 condition*/) {
        crit.add(Restrictions.eq("s1", s1));
    }

    if (/*some s2 condition*/) {
        crit.add(Restrictions.like("s2", s2 + "%"));
    }

    if (/*some s3 condition*/) {
        crit.add(Restrictions.ne("s3", s3));
    }

    return crit.list();
}

Представьте, что вы должны сделать что-то вродев HQL вам придется динамически создавать строку запроса HQL на лету, что может сделать код немного неприятным для чтения.

0 голосов
/ 23 февраля 2012

Я использую статический класс для всех моих базовых операций получения, сохранения, обновления, удаления в Hibernate, и он работает довольно хорошо.

public static List getList(Class c, Session session)
{
    return session.createQuery("FROM " + c.getSimpleName()).list();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...