2017-03-05 1 views
0

Je suis en train de cartographier les résultats d'une NativeQuery à un POJO non-entité, en utilisant SqlResultSetMapping et ConstructorResultexception de transtypage de classe en utilisant SqlResultSetMapping et ConstructorResult

J'utilise cette classe StreetCity, avec la cartographie des résultats:

@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; 
    } 
} 

c'est la fonction qui effectue la NativeQuery

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

c'est la requête qui devrait être ex 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; 
    } 

mais je suis toujours obtenir une exception

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 

Edit: l'erreur vient de la 2ème ligne de ce code:

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

Oracle a le exact same example in the javadoc, donc Qu'est-ce que je fais mal?

+0

Limite 1 n'est pas valide oracle syntaxe – BobC

+0

vrai, j'ai oublié de le supprimer initialy, mais sans la limite 1, le re sult est le même –

+0

cela peut-être aider.http: //stackoverflow.com/questions/26375565/jpa-2-1-constructorresult-causing-classcastexception ' –

Répondre

1

trouvé deux solutions, dans les deux cas, StreetCity DOIT être un @Entity

utilisant @ConstructorResult, il faut aussi les constructeurs.

solution 1, en utilisant @EntityResult au lieu de @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; 
} 

solution 2, en utilisant @ConstructorResult, avec les constructeurs:

@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; 
    } 
} 

aucun autre changement de code nécessaires, je suppose que la solution 1 est le plus propre