Java JPA查询返回对象[],而不是所需的实体

Java JPA查询返回对象[],而不是所需的实体,java,sql-server,jpa,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) {

我使用以下代码查询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;
List continets=new ArrayList();
列表元组=(列表)em.createNativeQuery(“从大陆选择*).getResultList();
for(对象[]元组:元组){
System.out.println(元组[0]);
}
返回大陆;
我之所以使用这段代码,是因为我无法直接从数据库中获取所需的实体类型(大陆)

我的查询应该是什么样子

这是我的大陆课程的开始:

@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()
    {}
@实体
@桌子
公共类实现可序列化{
@列(name=“name”)
私有财产名称;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有IntegerProperty-id;
@OneToMany(mappedBy=“大陆”)
专用连接;
列出国家名单;
公共大陆(字符串naam)引发SQLException{
名称=新SimpleStringProperty(naam);
大陆ID=新的SimpleIntegerProperty();
}
受保护大陆()
{}
这是我的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>

org.eclipse.persistence.jpa.PersistenceProvider
大陆
你可以这样做

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

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

List<Continent> tuples = em.createNativeQuery("SELECT * FROM Continents", Continent.class).getResultList();
List tuples=em.createNativeQuery(“从大陆选择*”,大陆.class).getResultList();
或者只使用jpql查询:

List<Continent> tuples = em.createQuery("SELECT c FROM Continent c", Continent.class).getResultList();
List tuples=em.createQuery(“从大陆c中选择c”,大陆.class).getResultList();
在第二个示例中,结果类是可选的,但这样可以得到
TypedQuery
,并且可以避免强制转换。
请注意,对于jpql,您提供的是实体名称,而不是本机查询中的表名称。

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


List continents=(List)em.createQuery(“从Continental c中选择c”).getResultList();

这给了我这个错误:由以下原因引起:异常[EclipseLink-4002](Eclipse持久性服务-2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.DatabaseException内部异常:com.microsoft.sqlserver.jdbc.SQLServerException:列名“c”无效。
大陆
实际上是一个
实体
,也就是说,它是否用
@Entity
注释并将属性标记为
@Id
?是的,我编辑了OP以显示此
createNativeQuery(“普通sql查询”)
createQuery(“使用jpql”)
大陆是否实际在
包中?由于您明确指定了
域.大陆
类,您可能还需要指定
连接
国家
。您还需要提供
国家
属性的映射信息。在元组[0]是实体的id,在元组中[1]是实体的名称…@HardUser我已经更新了我的答案。您可能需要将setter方法更改为您定义的名称。是的,我可以这样做作为一种解决方法,但我宁愿将实体直接从dbOption中删除。选项1给我的原因是:异常[EclipseLink-6007](Eclipse持久性服务-2.5.2.v20140319-9ad6abd):org.Eclipse.Persistence.exceptions.QueryException异常描述:缺少[class domain.Continental]的描述符。查询:ReadAllQuery(referenceClass=Continental sql=“选择来自Continents的*)选项2给出的原因是:java.lang.IllegalArgumentException:在EntityManager中创建查询时发生异常:异常描述:编译问题[SELECT c FROM Continental c]。[14,23]抽象架构类型“Continental”未知。那么,您的持久化单元的配置可能有错误。您如何配置它?您有persistence.xml、orm.xml还是以其他方式配置EntityManager工厂?我有persistence.xml。您能提供更多信息吗?persistence.xml中有什么,您的环境是什么ment—您是将其用于ejb、spring应用程序还是独立JavaSE?