Сложность теперь в 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();
}