2015-10-27 20 views
0

我使用的是选择新的语法来查询数据库中的非实体,并得到一个没有映射错误...JPA非实体没有映射错误与选择,新的语法

对象(不实体):

package user; 

public class User { 
    private int id; 
    private String lastName; 
    private String firstName; 
    private String mail; 
} 

P042USER)是这样创建的表:

CREATE TABLE P042USER (id INT PRIMARY KEY NOT NULL, lastname VARCHAR(100), firstname VARCHAR(100), email VARCHAR(255)); 

然后我想做的的要求选择新语法:

Query q = em.createQuery("SELECT NEW user.User(u.id, u.lastname, u.firstname, u.email) FROM P042USER u ORDER BY u.id"); 
return q.getResultList(); 

最后我得到了错误:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: P042USER is not mapped 

当然它没有被映射,这就是为什么我用的是选择新的语法...你有什么想法吗?谢谢。

回答

1

在您使用实体的JPQL中。在你的情况下,你需要的是一个本地查询和SqlResultSetMapping。以JavaDoc为例,请查看ConstructorResult

+0

我没有一个实体,所以我把注释@SqlResultSetMapping放在哪里?顺便说一句,它看起来很复杂。我见过很多引用,其中选择新似乎工作...当我使用createNativeQuery而不是createQuery,我有另一个错误:引起:org.h2.jdbc.JdbcSQLException:列“新”没有找到; –

+0

的确,SqlResultSetMapping只能在实体上使用,但它可以在任何实体上使用,因此您只需将它放在持久性上下文中的任意实体上即可。 –

0

或者,你可以修改你User类是可以映射到比你P042USER表之外的特定表的实体(由@Entity注释)。例如,将其映射到名为ANOTHER_USER的表。当您创建新的用户实体时,可以将它们持久保存到您的ANOTHER_USER。与此同时,当您针对您的P042USER表执行原生SQL查询时,您的本机SQL的结果可以映射到User类。

这个实现的例子可以在我的github repo中看到。

+0

最好的解决方案确实是确实拥有实体,但今天这是一项艰巨的工作,因为有将近数百个对象进行映射(此外,表名和列名与对象名和字段不匹配)。没有人有选择新语法的解决方案? –