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