2015-04-02 4 views
1

Я использую этот код, чтобы сделать запрос к базе данных SQL Server:JPA запрос возвращает Object [] вместо желаемого объекта

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; 

Я использую этот код, потому что я не могу получить нужный тип объекта (Continent) прямо из базы данных.

Как должен выглядеть мой запрос?

Это начало моего класса континент:

@Entity 
@Table 
public class Continent implements Serializable { 
    @Column(name = "Name") 
    private StringProperty name; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ContinentID") 
    private IntegerProperty continentId; 
    @OneToMany(mappedBy="continent") 
    private Connection connection; 
    List<Country> countries; 


    public Continent(String naam) throws SQLException { 
     name = new SimpleStringProperty(naam); 
     continentId = new SimpleIntegerProperty(); 
    } 

    protected Continent() 
    {} 

Это мой 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> 
+0

Это дает мне эту ошибку: Вызванный: Exception [EclipseLink-4002] (Eclipse, послесвечение услуги - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException Внутренняя Исключение: com.microsoft.sqlserver .jdbc.SQLServerException: Недопустимое имя столбца 'c'. –

+0

является 'Континент' фактически' Entity', т. Е. Аннотируется с '@ Entity' и имеет свойство, помеченное как' @ Id'? – Vladimir

+0

Да, я отредактировал OP, чтобы показать это –

ответ

0

Вы могли бы сделать

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

Для заполнения списка.

Edit:

Основываясь на ваш комментарий Вы можете сделать это вместо того, чтобы:

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

в кортеже [0] является идентификатором объекта и в кортеже [1] является именем объекта ... –

+0

@HardUser Я обновил свой ответ. Возможно, вам придется изменить методы настройки на имена, которые вы определили. – FMC

+0

Да, я могу сделать это как обходной путь, но у меня есть сущность прямо из db. –

3

Вы должны предоставить в результате класс, если вы используете родной запрос:

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

или просто использовать jpql запрос:

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

Во втором примере класс результата не является обязательным, но таким образом вы получаете TypedQuery и можете избежать кастинга. Обратите внимание, что в случае jpql вы указываете имя сущности, а не имя таблицы, как в исходном запросе.

+0

Вариант 1 дает мне причину: Исключение [EclipseLink-6007] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org .eclipse.persistence.exceptions.QueryException Исключение Описание: Отсутствует дескриптор для [domain domain.Continent]. Query: ReadAllQuery (referenceClass = Continent sql = "SELECT * FROM Continents") –

+0

Вариант 2 дает мне причину: java.lang.IllegalArgumentException: Исключение произошло при создании запроса в EntityManager: Исключение Описание: Сбор неполадок [SELECT c FROM Continent c]. [14, 23] Тип абстрактной схемы «Континент» неизвестен. –

+0

, вероятно, есть ошибка в конфигурации вашей единицы персистентности. как его настроить? у вас есть persistence.xml, orm.xml или вы настраиваете фабрику EntityManager каким-то другим способом? – Vladimir

0

Для простого запроса, как это лучше всего использовать em.createQuery, а не em.createNativeQuery, который предполагает, что класс Continent управляется менеджером сущности em.

Список континентов = (Список) em.createQuery ("SELECT c FROM Continent c"). GetResultList();

Смежные вопросы