【发布时间】:2012-08-29 13:47:43
【问题描述】:
我原来的问题是https://stackoverflow.com/questions/12172614/hql-join-without-foreign-key-reference
但找不到任何解决方案,因此使用 JPA 进行本机查询。 entityManager 的 createNativeQuery 返回 Query 对象,该对象又返回 List<Object[]>。我不想在迭代列表时处理索引,因为它本质上很容易出错。因此,我查看了一些其他解决方案,并发现 JPQL 的构造函数表达式作为解决方案之一。
表结构是
Schema1 -TableA
- NameColumn
- PhoneColumn
对应的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;
}
}
查询是
Select NEW com.xyz.PersonSearch(ms.NameColumn, ms.PhoneColumn) From Schema1.TableA ms Where ms.PhoneColumn='9134409930'
使用 entityManager API 运行此查询时
entityManager.createQuery(queryString, PersonSearch.class);
遇到错误。
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']
我的代码有什么问题?有什么想法吗?
【问题讨论】:
-
您应该使用带有结果集映射器的本机查询。
-
你不是用
createQuery(String, Class)代替createNativeQuery(String, Class)吗?我认为 JPA 期望TableA成为一个模型类,而不是将其用作表名。 -
@arturo,如果我使用 createNativeQuery(String,class),得到一个异常 org.hibernate.MappingException: Unknown entity:com.xyz.PersonSearch。我认为,在这种情况下,它也希望它是实体。我找不到合适的文档来使用它。
-
谁说你应该使用 createNativeQuery?他说您的 JPQL 查询是错误(在 JPA 规范和任何体面的 JPA 实现的文档中定义得足够好)。
标签: hibernate jpa jpa-2.0 jpql