带有逆向工程视图的 QuerySyntaxException

QuerySyntaxException with reversed engineered view

我想 select 从执行大量有用计算的数据库视图中记录。我首先将以下片段添加到 .reveg.xml 文件中:

<table-filter match-name="v_candidate" />

<table name="v_candidate">
    <primary-key>
        <key-column name="id"/>
    </primary-key>
</table>

逆向工程正在生成这个 VCandidate.hbm.xml 文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Mar 23, 2016 12:12:19 PM by Hibernate Tools 4.3.1.Final -->
<hibernate-mapping>
    <class name="db.VCandidate" table="v_candidate" optimistic-lock="version">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property name="outflowElevation" type="big_decimal">
            <column name="outflow_elevation" precision="131089" scale="0" />
        </property>
        <property name="name" type="string">
            <column name="name" />
        </property>
        <property name="floodedVolume" type="java.lang.Double">
            <column name="flooded_volume" precision="17" scale="17" />
        </property>
        <property name="servedArea" type="big_decimal">
            <column name="served_area" precision="131089" scale="0" />
        </property>
    </class>
</hibernate-mapping>

以及以下 VCandidate class:

package db;
// Generated Mar 23, 2016 12:12:19 PM by Hibernate Tools 4.3.1.Final

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * VCandidate generated by hbm2java
 */
public class VCandidate implements java.io.Serializable {

    private Integer id;
    private BigDecimal outflowElevation;
    private String name;
    private Double floodedVolume;
    private BigDecimal servedArea;

    public VCandidate() {
    }

    public VCandidate(Integer id) {
        this.id = id;
    }

    public VCandidate(Integer id, BigDecimal outflowElevation, String name, Double floodedVolume, BigDecimal servedArea) {
        this.id = id;
        this.outflowElevation = outflowElevation;
        this.name = name;
        this.floodedVolume = floodedVolume;
        this.servedArea = servedArea;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public BigDecimal getOutflowElevation() {
        return this.outflowElevation;
    }

    public void setOutflowElevation(BigDecimal outflowElevation) {
        this.outflowElevation = outflowElevation;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getFloodedVolume() {
        return this.floodedVolume;
    }

    public void setFloodedVolume(Double floodedVolume) {
        this.floodedVolume = floodedVolume;
    }

    public BigDecimal getServedArea() {
        return this.servedArea;
    }

    public void setServedArea(BigDecimal servedArea) {
        this.servedArea = servedArea;
    }
}

然后我尝试从该视图中检索可用的记录:

Query query =  session.createQuery("from VCandidate");

这会立即导致熟悉的异常:

Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: VCandidate is not mapped [from VCandidate]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:76)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1894)
    at opt.Main.plotData(Main.java:66)
    at opt.Main.main(Main.java:90)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: VCandidate is not mapped
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:171)
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91)
    at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:76)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:321)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3701)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3590)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:716)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:572)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:309)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:257)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190)
    ... 9 more

为此视图生成的 .hbm.xml.java 文件遵循与为表生成的文件几乎相同的模式。但是对于表格,我可以毫无问题地检索记录。

我错过了什么?

我通过使用本机查询而不是使用 HQL 来让它工作。像这样:

Query query = session.createSQLQuery(
    "select * from v_candidate")
    .addEntity(VCandidate.class);
List<VCandidate> candidates = query.list();

这更像是一种变通方法,但目前它可以很好地完成工作。