2012-04-14 10 views
0

ich mit Postgres arbeitete und mit JPA mit Hibernate, in Postgres und anderen DBMS kann dies tun:kann dies Hibernate mit JPA/

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

Meine Frage ist, kann die Abfrage ein zusätzliches Feld angezeigt werden (xyz), obwohl es keine solche Spalte gibt. Ich kann das mit Hibernate JPA machen.

Antwort

0

Mit org.hibernate.SQLQuery können Sie native SQL-Abfragen mit Hibernate erstellen. Sie führen diese Abfragen dann genauso aus wie mit einer normalen Hibernate-Abfrage. Offensichtlich werden Sie viele Vorteile verlieren, wenn Sie Ihre Abfragen von Hibernate und JPA verwalten lassen. Wenn sie jedoch die gewünschte Funktion nicht unterstützen, ist dies möglicherweise die einzige Möglichkeit.

1

Wenn Sie nicht über ein zugeordnetes Unternehmen haben, dann müssen Sie nativen Abfragen verwenden:

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

Andernfalls, wenn Sie ein zugeordnetes Unternehmen haben Sie diese mit typisierten Abfragen oder die Kriterien API tun können.

Mit typisierten Anfragen:

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(); 

mit Kriterien 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

Eine andere Lösung ist die Formeln zu verwenden, wenn Sie Ihre Funktion auf einigen Feldern der Tabelle aufrufen, und Sie wollen immer die Ergebnis der Funktion können Sie eine andere Eigenschaft in Ihrer Entität zuordnen und mit @Formula("myFunction(field1, field2)") annotieren. Hibernate wird dies zu all Ihren Abfragen hinzufügen, die Ihre Entität haben.