2012-04-14 2 views
0

Я работаю с Postgres и используя JPA в спящий режим, в Postgres и другие СУБД могут сделать это:может сделать это с помощью JPA/Hibernate

SELECT *, function(parameter) AS xyz FROM table WHERE condition 

Мой вопрос заключается в следующем, запрос может отображать дополнительное поле (xyz), хотя такого столбца нет. Я могу сделать это с Hibernate JPA.

ответ

0

С помощью org.hibernate.SQLQuery вы можете создавать собственные SQL-запросы с помощью Hibernate. Затем вы выполняете эти запросы так же, как и с обычным Hibernate-запросом. Очевидно, что вы потеряете много преимуществ, позволяющих Hibernate и JPA управлять вашими запросами, но если они не поддерживают функцию, которую вы хотите, это может быть единственный способ сделать это.

1

Если вы не отображенный объект, то вам нужно будет использовать собственные запросы:

Query query = entityManager 
     .createQuery(
      "SELECT t.*, myfunction(:parameter) FROM table t WHERE t.attr = condition"); 
query.setParameter("parameter", value); 
List resultList = query.getResultList(); 

В противном случае, если у вас есть отображенный примитив, который вы можете сделать это с помощью типизированных запросов или критерии API.

С типизированных запросов:

TypedQuery<Object[]> query = entityManager 
     .createQuery(
      "SELECT t.*, FUNC('MyFunction', :parameter) FROM table t WHERE t.attr = condition", 
      Object[].class); 
query.setParameter("parameter", value); 
List<Object[]> resultList = query.getResultList(); 

критериям API:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Tuple> query = criteriaBuilder.createTupleQuery(); 
Root<Table> root = query.from(Table.class); 
Expression<Long> funcExpr = criteriaBuilder.function("myfunction", 
     Long.class, root.get("parameter")); 
query.multiselect(query.select(root), funcExpr); 
List<Tuple> resultList = entityManager.createQuery(query) 
     .getResultList(); 
0

Другим решением является использование формул, если вы вызываете вашу функцию на некоторых полях таблицы, и вы всегда хотите результат функции вы можете сопоставить другое свойство в своей сущности и аннотировать его @Formula("myFunction(field1, field2)"). Hibernate добавит это ко всем вашим запросам, у которых есть ваша сущность.

Смежные вопросы