带有逆向工程视图的 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();
这更像是一种变通方法,但目前它可以很好地完成工作。
我想 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();
这更像是一种变通方法,但目前它可以很好地完成工作。