繁体   English   中英

Hibernate:为什么createQuery()将包名称附加到实体名称?

[英]Hibernate : why createQuery() appends package name to the Entity Name?

我正在尝试从两个不同的表查询数据库,即

query = "select rbt.rbtCode, rbt.maskedName, cmas.catId, cmas.maskedName " +
    "from CrbtRbt rbt, CrbtCategoryMaster cmas " +
    "where rbt.playable='Y' and rbt.showOnWeb='Y' and rbt.rbtCode!=0 " +
    "and rbt.catId=cmas.catId";

但是当我通过session.createQuery(query);传递此查询时session.createQuery(query);

它将包名称附加到即将到来的实体名称的下一个

select rbt.rbtCode, rbt.maskedName, cmas.catId, cmas.maskedName
from CrbtRbt rbt, com.telemune.toolGeneratedPojos.CrbtCategoryMaster cmas
where rbt.playable='Y' and rbt.showOnWeb='Y' and rbt.rbtCode!=0 and rbt.catId=cmas.catId

并给出以下异常:

org.hibernate.hql.internal.ast.QuerySyntaxException: CrbtRbt is not mapped [select rbt.rbtCode, rbt.maskedName, cmas.catId, cmas.maskedName from CrbtRbt rbt, com.telemune.toolGeneratedPojos.CrbtCategoryMaster cmas where rbt.playable='Y' and rbt.showOnWeb='Y' and rbt.rbtCode!=0 and rbt.catId=cmas.catId]
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:325)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3252)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3141)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:694)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:550)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:287)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:235)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:119)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:214)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:192)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1537)
at com.telemune.generator.TestQuery.select(TestQuery.java:114)
at com.telemune.generator.PojoGenerator.main(PojoGenerator.java:191)

但是,如果我一一查询实体,则会成功显示所需的结果。

select rbt.rbtCode, rbt.maskedName
from CrbtRbt rbt
where rbt.playable='Y' and rbt.showOnWeb='Y' and rbt.rbtCode!=0;

给出期望的结果。

谁能解释我该怎么办?

这是一些示例代码: 查询代码

 hql = session.createQuery(query);
    hql.setMaxResults( querySchema.getMaxRes() );
    list=hql.list();

有关信息,我已经完成了所有映射,并非常仔细地包括了所有库,没有任何错误的机会。

UPDATE

正如我所说的,我已经仔细完成了映射,但是可能有人对此表示怀疑,所以这里是映射:

<hibernate-mapping>
    <class name="com.telemune.toolGeneratedPojos.CrbtCategoryMaster" schema="SDP" table="CRBT_CATEGORY_MASTER">
            <id name="catId" type="java.lang.Integer">
                <column name="CAT_ID" precision="4" scale="0" />
                <generator class="assigned" />
            </id>
            <property column="SHOW_IN_SMS" name="showInSms" type="java.lang.String" />
            <property column="SHOW_ON_WEB" name="showOnWeb" type="java.lang.String" />
            <property column="PLAYABLE" name="playable" type="java.lang.String" />
            <property column="STATUS" name="status" type="java.lang.String" />
            <property column="IMAGE_PATH" name="imagePath" type="java.lang.String" />
            <property column="DESCRIPTION" name="description" type="java.lang.String" />
            <property column="MASKED_NAME" name="maskedName" type="java.lang.String" />
            <property column="IVR_FILEPATH_1" name="ivrFilepath1" type="java.lang.String" />
            <property column="IVR_FILEPATH" name="ivrFilepath" type="java.lang.String" />
            <property column="MASKED_NAME_1" name="maskedName1" type="java.lang.String" />
    </class></hibernate-mapping>

对于CRBT_RBT:

<hibernate-mapping>
    <class name="com.telemune.toolGeneratedPojos.CrbtRbt" schema="SDP" table="CRBT_RBT">
            <id name="rbtCode" type="java.lang.Integer">
                <column name="RBT_CODE" precision="10" scale="0" />
                <generator class="assigned" />
            </id>
            <property column="PLAYABLE" name="playable" type="java.lang.String" />
            <property column="OTHER" name="other" type="java.lang.Integer" />
            <property column="IMAGE_PATH" name="imagePath" type="java.lang.String" />
            <property column="RBT_ORDER" name="rbtOrder" type="java.lang.Integer" />
            <property column="VALIDITY_PERIOD" name="validityPeriod" type="java.lang.Integer" />
            <property column="LYRICIST" name="lyricist" type="java.lang.String" />
            <property column="APPROVED_BY" name="approvedBy" type="java.lang.String" />
            <property column="PREV_CAT_ID" name="prevCatId" type="java.lang.Integer" />
            <property column="RELEASE_YEAR" name="releaseYear" type="java.lang.Integer" />
            <property column="COMPOSER" name="composer" type="java.lang.String" />
            <property column="SHOW_ON_WEB" name="showOnWeb" type="java.lang.String" />
            <property column="MASKED_NAME" name="maskedName" type="java.lang.String" />
            <property column="CONTENT_PROVIDER_CODE" name="contentProviderCode" type="java.lang.Integer" />
            <property column="CREATE_DATE" name="createDate" type="java.sql.Date" />
            <property column="IVR_FILEPATH" name="ivrFilepath" type="java.lang.String" />
            <property column="CORP_ID" name="corpId" type="java.lang.Integer" />
            <property column="SHOW_IN_SMS" name="showInSms" type="java.lang.String" />
            <property column="ALBUM_NAME" name="albumName" type="java.lang.String" />
            <property column="NOKIA" name="nokia" type="java.lang.Integer" />
            <property column="STATUS" name="status" type="java.lang.String" />
            <property column="FILE_PATH" name="filePath" type="java.lang.String" />
            <property column="REFERENCE_ID" name="referenceId" type="java.lang.Integer" />
            <property column="CHARGING_CODE" name="chargingCode" type="java.lang.Integer" />
            <property column="RBT_NICK" name="rbtNick" type="java.lang.String" />
            <property column="APPROVAL_DATE" name="approvalDate" type="java.sql.Date" />
            <property column="CAT_ID" name="catId" type="java.lang.Integer" />
            <property column="RBT_SCORE" name="rbtScore" type="java.lang.Integer" />
            <property column="ARTIST_NAME" name="artistName" type="java.lang.String" />
    </class>
</hibernate-mapping>

我认为映射中没有任何错误。

Hibernate.cfg.xml:

<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="hibernate.connection.password">sdp</property>
    <property name="hibernate.connection.url">jdbc:oracle:thin:@10.168.2.127:1521:mastera</property>
    <property name="hibernate.connection.username">sdp</property>
    <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
    <mapping resource="com/telemune/toolGeneratedPojos/CrbtRbt.hbm.xml"/>
    <mapping resource="com/telemune/toolGeneratedPojos/CrbtCategoryMaster.hbm.xml"/>
</session-factory>
</hibernate-configuration>

好吧,我明白了。

SessionFactory getSessionFactory(className) {
    try {
         configuration.addResource( className + ".hbm.xml" );
    }catch (Exception e) {
    e.printStackTrace();
}

configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();

返回configuration.buildSessionFactory(serviceRegistry);

这是在创建会话工厂时为每个类以编程方式添加.hbm.xml文件的代码。

try {
    sessionFactory = ...getSessionFactory(className);
    session = sessionFactory.openSession();
}
catch (Exception e) {
    e.printStackTrace();
}

这段代码的问题是:

1.它正在为每个调用(getSessionFactory(classname)的调用)建立一个新的会话工厂。

2.每次都打开一个新会话。 因此,仅将添加到配置中的最后一个类的映射作为资源添加,这就是为什么它通过将packageName附加到其名称来搜索其他类的原因。

我要做的是:我只计算了包中没有映射文件,并借助同一个会话工厂中的循环添加了它们。 而且有效。

方法如下:

File file = new File(packageName.replace(".", "/"));
for(File file1 : file.listFiles()){
    if(file1.getName().trim().substring(file1.getName().trim().lastIndexOf("."),
       file1.getName().trim().length()).equalsIgnoreCase(".xml")){
       configuration.addResource( packageName.replaceAll("\\.", "/") + "/" + file1.getName() );
    }
}

这只是一个愚蠢的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM