【问题标题】:JPA query returns Object[] instead of desired entityJPA 查询返回 Object[] 而不是所需的实体
【发布时间】:2015-04-02 15:32:12
【问题描述】:

我使用这段代码对 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>

【问题讨论】:

  • 这给了我这个错误: 原因:异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 内部异常: com .microsoft.sqlserver.jdbc.SQLServerException:列名“c”无效。
  • Continent 实际上是Entity,即它是否用@Entity 进行了注释并且具有标记为@Id 的属性?
  • 是的,我已经编辑了 OP 来显示这个
  • createNativeQuery("normal sql query")createQuery("uses jpql")
  • Continent 实际上在 domain 包中吗?由于您明确指定domain.Continent 类,您可能还需要指定ConnectionCountry。您还需要提供countries 属性的映射信息。

标签: java sql-server jpa


【解决方案1】:

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

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 给我原因:异常 [EclipseLink-6007] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.QueryException 异常描述:缺少描述符[类域.大陆]。查询:ReadAllQuery(referenceClass=Continent sql="SELECT * FROM Continents")
  • 选项 2 给我原因:java.lang.IllegalArgumentException:在 EntityManager 中创建查询时发生异常:异常描述:编译问题 [SELECT c FROM Continent c]。 [14, 23] 抽象模式类型“大陆”未知。
  • 那么你的持久化单元的配置可能有错误。你如何配置它?你有persistence.xml、orm.xml 还是用其他方式配置EntityManager 工厂?
  • 我有 persistence.xml
  • 您能提供更多信息吗? persistence.xml 里面有什么,你的环境是什么——你是用 ejb、spring 应用程序还是独立的 java se 使用它?
【解决方案2】:

你可以的

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

【讨论】:

  • 在 tuple[0] 中是实体的 id,在 tuple[1] 中是实体的名称 ...
  • @HardUser 我已经更新了我的答案。您可能需要将 setter 方法更改为您定义的名称。
  • 是的,我可以将其作为一种解决方法,但我宁愿将实体直接从数据库中取出
【解决方案3】:

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

列出大洲 = (List)em.createQuery("SELECT c FROM Continent c").getResultList();

【讨论】:

    猜你喜欢
    • 2022-11-20
    • 2023-03-07
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多