La requête JPA renvoie Object au lieu de l'entité souhaitée

J'utilise ce code pour faire une requête à une database SQL Server:

List<Continent> continents = new ArrayList<>(); List<Object[]> tuples = (List<Object[]>) em.createNativeQuery("SELECT * FROM Continents").getResultList(); for (Object[] tuple : tuples) { System.out.println(tuple[0]); } return continents; 

J'utilise ce code parce que je ne peux pas get le type d'entité désiré (Continent) directement hors de la database.

Comment devrait ressembler ma requête?

C'est le début de ma class de continent:

 @Entity @Table public class Continent implements Serializable { @Column(name = "Name") private SsortingngProperty name; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ContinentID") private IntegerProperty continentId; @OneToMany(mappedBy="continent") private Connection connection; List<Country> counsortinges; public Continent(Ssortingng naam) throws SQLException { name = new SimpleSsortingngProperty(naam); continentId = new SimpleIntegerProperty(); } protected Continent() {} 

C'est mon file persistence.xml:

 <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="HOGENT1415_11" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>domain.Continent</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=HOGENT1415_11"/> <property name="javax.persistence.jdbc.user" value="sa"/> <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <property name="javax.persistence.jdbc.password" value="root"/> </properties> </persistence-unit> </persistence> 

Vous devez fournir la class résultante si vous utilisez une requête native:

 List<Continent> tuples = em.createNativeQuery("SELECT * FROM Continents", Continent.class).getResultList(); 

ou utilisez simplement la requête jpql:

 List<Continent> tuples = em.createQuery("SELECT c FROM Continent c", Continent.class).getResultList(); 

Dans le second exemple, la class de résultat est facultative, mais vous obtenez ainsi TypedQuery et vous évitez ainsi le casting. Notez que dans le cas de jpql, vous fournissez le nom de l'entité, pas le nom de la table comme dans la requête native.

Vous pourriez faire

 for (Object[] tuple : tuples) { continents.add((Continent) tuple[0])); } 

Pour remplir votre list

Modifier:

En fonction de votre commentaire, vous pouvez le faire à la place:

 for (Object[] tuple : tuples) { Continent c = new Continent(); c.setID(tuple[0]); c.setName(tuple[1]); continents.add(c); } 

Pour une requête simple comme celle-ci, il vaut mieux simplement utiliser em.createQuery plutôt qu'em.createNativeQuery, c'est-à-dire que la class Continent est gérée par le gestionnaire d'entités em.

Liste continents = (Liste) em.createQuery ("SELECT c FROM Continent c"). GetResultList ();