2017-03-05 121 views
0

我想一個NativeQuery的結果映射到非實體POJO,使用SqlResultSetMappingConstructorResult類轉換異常使用SqlResultSetMapping和ConstructorResult

我使用這個StreetCity類,用結果映射:

@Data 
@SqlResultSetMapping(name = "StreetCityResult", classes = { 
     @ConstructorResult(targetClass = StreetCity.class, columns = { 
       @ColumnResult(name = "street", type = String.class), 
       @ColumnResult(name = "city", type = String.class) }) }) 
public class StreetCity { 
    public String street; 
    public String city; 

    public StreetCity(String street, String city) { 
     this.street = street; 
     this.city = city; 
    } 
} 

這是執行NativeQuery

public List<StreetCity> retrieveStreetCity(String zipCode, int houseNumber) { 
     Query query = em.createNativeQuery(getLocationQuery(zipCode, houseNumber), "StreetCityResult"); 
     List<StreetCity> streetCityList = query.getResultList(); 
     return streetCityList; 
    } 

這是應該是前查詢功能cuted

public String getLocationQuery(String zipCode, int houseNumber) { 
     String query = 
      "select straat.straatnaam as street, plaats.plaatsnaam as city " 
      + " from pcreeks " 
      + " left join plaats on plaats.plaatsid = pcreeks.plaatsid " 
      + " left join straat on straat.straatid = pcreeks.straatid " 
      + " where (...) "; 
     return query; 
    } 

但我仍然得到一個異常

2017-03-05T16:35:57.736+0100|Warning: javax.ejb.EJBException 
Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to nl.xxx.service.business.locations.entity.StreetCity 

編輯: 錯誤來源於此代碼的第2行:

List<StreetCity> streetCityList = storage.retrieveStreetCity(zipCode, houseNumber); 
streetCityList.get(0).getStreet(); 

甲骨文有exact same example in the javadoc,所以我究竟做錯了什麼?

+0

限制1是無效的oracle語法 – BobC

+0

真的,我忘了刪除它初始化,但沒有限制1,重新sult是相同的 –

+0

這也許help.'http://stackoverflow.com/questions/26375565/jpa-2-1-constructorresult-causing-classcastexception' –

回答

1

發現了兩個解決方案,在這兩種情況下,StreetCity必須是一個@Entity

使用@ConstructorResult,還需要構造函數。

溶液1,使用@EntityResult代替@ConstructorResult

@Data 
@Entity 
@SqlResultSetMapping(name = "StreetCityMapping", entities = @EntityResult(entityClass = StreetCity.class, fields = { 
     @FieldResult(name = "street", column = "street"), @FieldResult(name = "city", column = "city") })) 
public class StreetCity { 
    @Id 
    public String street; 
    public String city; 
} 

溶液2,使用@ConstructorResult,具有構造:需要

@Data 
@Entity 
@SqlResultSetMapping(name = "StreetCityMapping", classes = { 
@ConstructorResult(targetClass = 
StreetCity.class, columns = { 
@ColumnResult(name = "street", type = String.class), 
@ColumnResult(name = "city", type = String.class) }) }) 
public class StreetCity { 
    @Id 
    public String street; 
    public String city; 

    public StreetCity() { 
    } 

    public StreetCity(String street, String city) { 
     this.street = street; 
     this.city = city; 
    } 
} 

沒有其他代碼的變化, 我想溶液1是最乾淨的一個