JPA查询返回Object []而不是所需的实体

时间:2015-04-02 15:32:13

标签: java sql-server jpa

我使用此代码对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;

我使用此代码是因为我无法直接从数据库中获取所需的实体类型(大陆)。

我的查询应该如何?

这是我的大陆班的开始:

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

3 个答案:

答案 0 :(得分:4)

如果您使用的是本机查询,则应提供结果类:

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的情况下,您提供实体名称,而不是像本机查询中那样的表名。

答案 1 :(得分:0)

你可以做到

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

填充您的列表。

编辑:

根据您的评论,您可以改为:

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

答案 2 :(得分:0)

对于像这样的简单查询,最好只使用em.createQuery而不是em.createNativeQuery,这假设类Continent由实体管理器em管理。

列出大陆=(列表)em.createQuery(&#34; SELECT c FROM Continent c&#34;)。getResultList();