Hibernate NamedNativeQuery with PostgreSQL 返回'relation does not exist'



我创建了一个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注释,但可能会工作。

最新更新