【问题标题】:partially mapping the result of a NamedNativeQuery to a class将 NamedNativeQuery 的结果部分映射到类
【发布时间】:2014-08-01 12:58:25
【问题描述】:

我有一个@EntityPerson,它有多个字段,我想将几​​个@NamedNativeQuerys 的结果映射到Person 类但是,我正在运行的查询不返回值Person 类中的每个字段。当我尝试运行查询时,出现以下错误:

[error] o.h.u.JDBCExceptionReporter - Invalid column name bar.
[error] play - Cannot invoke the action, eventually got an error: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query

我的班级是这样设置的:

@NamedNativeQueries({
    @NamedNativeQuery(
        name = "getBirthdate",
        //Returns values for {idnumber, name, birthdate}
        query = "EXEC dbo.proc_get_birthdate :name",
        resultClass = Person.class
    ),
    @NamedNativeQuery(
        name = "getBar",
        //Returns values for {idnumber, name, bar}
        query = "EXEC dbo.proc_get_bar :name",
        resultClass = Person.class
    )
})
@Entity
public class Person {
    @Id
    @Column(name = "idnumber")
    private int idNumber;
    @Column(name = "name")
    private String name;
    @Column(name = "birthdate")
    private String birthdate;
    @Column(name = "foo")
    private String foo;
    @Column(name = "bar")
    private String bar;

    //All appropriate getter and setter methods are implemented
}

我仔细检查了一下,Person 类中的所有列实际上都存在于被查询的表中。

我的实际班级要大得多,由于这个原因和一些安全问题,我不希望我的查询必须返回 EVERY 字段,我希望有一种简单的方法来给他们如果查询未返回值,则值为 null。我尝试在声明中将每个字段设置为null(示例如下),但这也不起作用。

@Column(name = "bar")
private String bar = null;

我真的不想为我需要运行的每个查询创建一个定制的类,所以如果我想要做的事情是可能的,任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 我不知道错误是由于映射。它看起来更像是一个 JDBC 错误,您试图返回表中不存在的列。我几乎可以肯定我已经做了类似的事情,不是所有的类变量都在查询中返回。
  • 在引发错误的查询中未引用该列。并且该列确实存在于表中。

标签: java hibernate jpa playframework-2.2


【解决方案1】:

我相信你误解了@NamedNativeQuery 的用法。此注释应与 SQL 查询一起使用,而不是与存储过程一起使用。查看异常SQLGrammarException: could not execute query 可以看出这是语法异常,无法解析查询。

在 JPA 2.1 中,您可以使用注释 @NamedStoredProcedureQuery,它支持存储过程。

【讨论】:

  • 我使用的框架实现了 JPA 2.0,这就是我使用 @NamedNativeQuery 的原因。
  • 但正如我所说,NamedNativeQuery 用于查询而不是过程。
  • 没有其他方法可以在 2.0 中调用存储过程(我知道),它适用于我只有一个查询附加到的实体
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 2013-06-13
  • 2021-12-17
  • 2018-12-21
相关资源
最近更新 更多