Java JPA查询返回对象[],而不是所需的实体
我使用以下代码查询sql server数据库: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) {
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?