我创建了一个bean类来适应我的webapp中的列表条目,因为这个bean应该使用来自许多db表的数据,我决定使用@NamedNativeQuery
注释,所以我可以准确地获取所需的数据(减少列表加载时间)。当我呼叫:
getSession().createCriteria(ProjectListEntry.class).list();
我得到以下异常:
org.hibernate.exception.SQLGrammarException: ERROR: relation "projectlistentry" does not exist
Position: 29
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at com.sun.proxy.$Proxy123.executeQuery(Unknown Source)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1897)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1698)
at org.hibernate.loader.Loader.doQuery(Loader.java:832)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293)
at org.hibernate.loader.Loader.doList(Loader.java:2382)
at org.hibernate.loader.Loader.doList(Loader.java:2368)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2198)
at org.hibernate.loader.Loader.list(Loader.java:2193)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:122)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1622)
at org.hibernate.internal.CriteriaImpl.__xr__list(CriteriaImpl.java:374)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java)
at org.hibernate.internal.CriteriaImpl.__xr__uniqueResult(CriteriaImpl.java:396)
at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java)
...
当然,我的数据库中没有projectlistentry表,因为我想从查询中创建这个实体。
我的ProjectListEntity
课是这样的:
@Entity
@SqlResultSetMapping(
name = "compositeKey",
entities = @EntityResult(
entityClass = <path>.ProjectListEntry.class,
fields = {
@FieldResult(name = "id", column = "p_id"),
@FieldResult(name = "title", column = "p_title"),
...
}
))
@NamedNativeQuery(
name = "fetchProjectListEntry",
query = "SELECT p.id AS p_id, " +
"p.title AS p_title, " +
... many fields and many joins here ...,
resultSetMapping = "compositeKey")
public class ProjectListEntry {
@Id
private Long id;
private String title;
...
}
在query
参数查询时,复制到pgadmin工作正常,显示我想放在这个类实例的所有数据的列表。
我必须在Criteria API中使用这个类,所以
getSession().createCriteria(ProjectListEntry.class).list();
必须正常工作,给我的结果列表与pgadmin中的查询完全相同。
我也愿意接受建议,这将导致我解决这个问题,即使不使用@NamedNativeQuery
注释。如果有需要,我可以提供更多的信息。
尝试用查询在数据库中创建视图,然后将其映射到您的实体。
这个解决方案不是完美的,因为如果你想改变你的bean,你必须改变视图。
此方法不使用@NamedNativeQuery
注释,但可能会工作。