2011-09-29 29 views
16

tôi chạy một truy vấn nguồn gốc JPA 2.0 như thế này:JPA 2.0 bản địa kết quả truy vấn dưới dạng bản đồ

Query query = em.createNativeQuery("SELECT NAME, SURNAME, AGE FROM PERSON"); 
List list = query.getResultList(); 

tại list có tất cả các hàng trả về bởi truy vấn. Tôi có thể lặp qua chúng, nhưng mỗi entry là một Object[] nơi:

  • tại index 0 Tôi tìm TÊN
  • tại chỉ số 1 tôi thấy HỌ
  • tại chỉ số 3 Tôi tìm TUỔI

Có ai tìm cách làm điều gì đó như thế này không:

Map<String, Object> row = list.get(index); 
String name = row.get("NAME"); 
String surname = row.get("SURNAME"); 
Integer age = row.get("AGE"); 

Tôi cần điều này vì truy vấn gốc mà tôi thực thi là truy vấn động và tôi không biết thứ tự của trường trong mệnh đề SELECT, vì vậy tôi không biết id truy vấn sẽ trông giống như:

SELECT SURNAME, NAME, AGE FROM PERSON 

hoặc

SELECT AGE, NAME, SURNAME FROM PERSON 

hoặc thậm chí

SELECT AGE, SURNAME, NAME FROM PERSON 
+0

truy vấn tiêu chí? http://www.ibm.com/developerworks/java/library/j-typesafejpa/ – NimChimpsky

+0

Tôi không nghĩ vậy, bởi vì tôi vẫn cần Person.class đằng sau. Như tôi đã nói SQL qeury là năng động và tôi thực sự không biết nó sẽ như thế nào. – kovica

Trả lời

10

nào JPA bạn đang sử dụng - Hibernate, EclipseLink hay cái gì khác?

Không có cách tiêu chuẩn để thực hiện điều này trong JPA nhưng việc triển khai cụ thể của bạn có thể cho phép - ví dụ: Eclipselink có gợi ý loại kết quả truy vấn.

http://dev.eclipse.org/mhonarc/lists/eclipselink-users/msg03013.html

Query query = entityManager.createNativeQuery(sql); 
query.setHint(QueryHints.RESULT_TYPE, ResultType.Map); 

Đối với Hibernate, với javax.persistence.Query dbQuery:

org.hibernate.Query hibernateQuery =((org.hibernate.jpa.HibernateQuery)dbQuery) 
.getHibernateQuery(); 
hibernateQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); 
+2

dường như ngủ đông không có một gợi ý :( – chrismarx

+2

Nó đang làm việc cho tôi sử dụng truy vấn nguồn gốc như thế này: 'NativeQueryImpl nativeQuery = (NativeQueryImpl) truy vấn; ' ' nativeQuery.setResultTransformer (AliasToEntityMapResultTransformer.INSTANCE);' 'Danh sách > result = query.getResultList(); ' ' Bản đồ row = result.get (0); ' String value = (String) row.get (" NAME ") ; –

2

Hãy xem về vấn đề này tôi đã nhận nó khi làm việc trên dự án mà tôi không thể sử dụng tất cả các tính năng JPA vì vậy tôi đã thử phương pháp jdbc truyền thống ngay cả khi tôi không khuyên bạn nên điều này nhưng nó làm việc cho tôi.

@LocalBean 
public class TCotisationEJB { 

    @PersistenceContext(unitName="ClaimsProjectPU") 
    private EntityManager em; 

    @TransactionAttribute(TransactionAttributeType.NEVER) 
    public List getCotisation(){ 
     Query query=em.createNativeQuery("select Annee,Mois,RetSonarwa from TCotisMIFOTRA2008 where matricule='10000493' order by Annee"); 
     List<Object[]> cotisation=query.getResultList(); 
     Object[] cotisationData; 

     for(int i=0;i<cotisation.size();i++){ 
       cotisationData=cotisation.get(i); 

      System.out.print("Annee: "+cotisationData[0]+" Mois :"+cotisationData[1]+" Amount  :"+cotisationData[2]+"\n"); 

    } 
    return query.getResultList(); 
    }  
} 
+1

Đây chính xác là những gì OP muốn thay đổi. – bargoras

1

Như khác đã đề cập, cũ JPA không hỗ trợ nó, tuy nhiên tôi có giải pháp workaround với Postgres 9.4 trong hoàn cảnh của tôi, trong khi làm việc với Jackson,

List<String> list = em.createNativeQuery("select cast(json_object_agg(c.config_key,c.config_value) as text) from myschema.configuration c") 
        .getResultList(); 

Để sử dụng nó trong Bean lớp sử dụng dưới đây phương pháp, nếu không trực tiếp trở lại.

//handle exception here, this is just sample 
Map map = new ObjectMapper().readValue(list.get(0), Map.class); 

Một số chức năng json khác, https://www.postgresql.org/docs/9.4/static/functions-json.html. Tôi chắc chắn bạn có thể tìm thấy tương tự cho các cơ sở dữ liệu khác.

Các vấn đề liên quan