2015-10-27 19 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

最好的解決方案確實是確實擁有實體,但今天這是一項艱鉅的工作,因爲有將近數百個對象進行映射(此外,表名和列名與對象名和字段不匹配)。沒有人有選擇新語法的解決方案? –