JPQL构造函数表达式 - org.hibernate.hql.ast.QuerySyntaxException:表未映射

Pan*_*kaj 3 hibernate jpa jpql jpa-2.0

我最初的问题是/sf/ask/852083011/ 但找不到任何解决方案,因此使用JPA进行本机查询.entityManager的createNativeQuery返回Query对象,而Query对象又返回List<Object[]>.我不想在迭代列表时处理索引,因为它本质上容易出错.因此我查看了其他解决方案,并发现JPQL的Constructor表达式作为解决方案之一.

表结构是

Schema1 -TableA

 - NameColumn
 - PhoneColumn
Run Code Online (Sandbox Code Playgroud)

对应的Java类是

    public class PersonSearch implements Serializable {

    public PersonSearch (String NameColumn, String PhoneColumn) {
        this.name = NameColumn;
        this.phone = PhoneColumn;
    }

    private String name;

    private String phone;

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getPhone() {
    return phone;
    }

    public void setPhone(String phone) {
    this.phone = phone;
    }
    }
Run Code Online (Sandbox Code Playgroud)

查询是

 Select NEW com.xyz.PersonSearch(ms.NameColumn, ms.PhoneColumn) From Schema1.TableA ms Where ms.PhoneColumn='9134409930'
Run Code Online (Sandbox Code Playgroud)

使用entityManager API运行此查询时

entityManager.createQuery(queryString, PersonSearch.class);
Run Code Online (Sandbox Code Playgroud)

低于错误.

Caused by: org.hibernate.hql.ast.QuerySyntaxException: Schema1.TableA is not mapped   [Select NEW com.xyz.PersonSearch(ms.NameColumn, ms.PhoneColumn) From Schema1.TableA ms Where ms.PHONE='9134409930']
Run Code Online (Sandbox Code Playgroud)

我的代码出了什么问题?任何的想法 ?

use*_*402 7

根据"Pro EJB 3 Java Persistence API"一书

构造函数表达式

SELECT涉及多个表达式的更强大的子句形式是构造函数表达式,它指定使用用户指定的对象类型存储查询的结果.请考虑以下查询:

SELECT NEW example.EmployeeDetails(e.name, e.salary, e.department.name)
FROM Employee e
Run Code Online (Sandbox Code Playgroud)

此查询的结果类型是类型example.EmployeeDetails.当查询处理器迭代查询结果时,它会实例化EmployeeDetails使用与查询中列出的表达式类型匹配的构造函数的新实例.在这种情况下,表达式类型是String,Double和String,因此查询引擎将搜索具有参数类型的构造函数.因此,生成的查询集合中的每一行都是EmployeeDetails包含员工姓名,薪水和部门名称的实例 .

必须使用对象的完全限定名称引用结果对象类型.但是,该类不必以任何方式映射到数据库.具有与SELECT子句中列出的表达式兼容的构造函数的任何类都可以在构造函数表达式中使用.

构造函数表达式是构建粗粒度数据传输对象或查看对象以在其他应用程序层中使用的强大工具.可以使用单个查询来收集准备好在网页上呈现的视图对象,而不是手动构造这些对象.

示例代码如下

List result = em.createQuery("SELECT NEW example.EmpMenu(e.name, e.department.name) " +
         "FROM Project p JOIN p.employees e " +
         "WHERE p.name = ?1 " +
        "ORDER BY e.name").setParameter(1, projectName).getResultList();
Run Code Online (Sandbox Code Playgroud)

EmpMenu类是一个简单的pojo,没有注释,但有正确的构造函数来匹配构造函数表达式.结果是返回的每行的EmpMenu对象列表.

我相信你的SQL"....来自Schema1.TableA ms .."应该引用一个映射的实体.所以你应该有一个映射到TableA的实体,然后jpql应该更像"....来自MyTableAEntity ms ...",其中MyTableAEntity具有将其映射到DB表TableA的所有正确的jpa注释.正如书籍片段所述,"SELECT NEW ..."的目标不必映射,但FROM子句中引用的实体也是如此.