我创建了一个bean类来适应我的webapp中列表中的条目,因为这个bean应该使用来自我决定使用@NamedNativeQuery
注释的许多db表中的数据,所以我可以准确地获取需要的数据(对于减少列表加载时间)。
我打电话的时候:
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;
...
}
复制到pgadmin时query
参数中的查询工作正常,显示我想要放在此类实例中的所有数据的列表。
我必须将此类与Criteria API一起使用,所以
getSession().createCriteria(ProjectListEntry.class).list();
必须正常工作,给我的结果列表与pgadmin中的查询完全相同。
我也愿意接受这样的建议,即使不使用@NamedNativeQuery
注释也会导致我解决这个问题。如果有需要,我可以提供更多信息。
答案 0 :(得分:0)
尝试使用您的查询在数据库中创建视图,然后将其映射到您的实体。
这个解决方案并不完美,因为如果你想改变你的bean,你也必须改变视图。
此方法不使用@NamedNativeQuery
注释,但可能会有效。