Наилучшая практика для создания динамического типизированного запроса JPA? - PullRequest
7 голосов
/ 29 октября 2010

Я пытаюсь преобразовать класс TableController, который мы использовали (без ORM) для генерации динамического SQL (фактически столбец порядка и направление добавляются в SQL).

Подумайте об этом 'TableController'как класс, в котором есть функция для возврата списка сущностей заданного класса (известного во время выполнения) в заданном порядке (имя столбца String / свойства, логическое значение asc / desc, оба во время выполнения).

Проблема теперь в JPA (Hibernate - но клиенту требуется использовать только интерфейсы JPA): как я могу реализовать это без объединения строк и безопасным способом?

Спасибо!

1 Ответ

18 голосов
/ 29 октября 2010

Сложность теперь в JPA (Hibernate - но клиенту требуется использовать только интерфейсы JPA): как я могу реализовать это без конкатенации строк и безопасным способом?

Если вы используете реализацию JPA 2.0, я думаю, вам следует обратиться к Criteria API для построения динамических запросов.

Если вы используете JPA 1.0, стандарт не существуеткроме конкатенации строк (и я бы предложил использовать проприетарные Критерии запросов Hibernate ).

Следующая статья также может дать вам некоторые (конкретные) идеи: Запрос Hibernate 102: Критерии API .


Представьте метод, который имеет три параметра: Class entityClass, String orderByColumn, логическое возрастание.Как мне создать запрос без конкатенации строк, который дает мне все объекты данного класса в правильном порядке?

С API Criteria из JPA 2.0 вы можете сделать что-то вроде этого:

public <T> List<T> findAllEntitiesOrderedBy(Class<T> entityClass, String orderByColumn, boolean ascending) {
    CriteriaBuilder builder = em.getCriteriaBuilder();

    CriteriaQuery<T> criteria = builder.createQuery(entityClass);
    Root<T> entityRoot = criteria.from(entityClass);
    criteria.select(entityRoot);
    javax.persistence.criteria.Order order = ascending ? builder.asc(entityRoot.get(orderByColumn))
        : builder.desc(entityRoot.get(orderByColumn));
    criteria.orderBy(order);
    return em.createQuery(criteria).getResultList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...