带有PostgreSQL的Hibernate NamedNativeQuery返回'关系不存在'

时间:2015-08-19 10:15:20

标签: java hibernate postgresql

我创建了一个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注释也会导致我解决这个问题。如果有需要,我可以提供更多信息。

1 个答案:

答案 0 :(得分:0)

尝试使用您的查询在数据库中创建视图,然后将其映射到您的实体。

这个解决方案并不完美,因为如果你想改变你的bean,你也必须改变视图。

此方法不使用@NamedNativeQuery注释,但可能会有效。