Java Hibernate查询语言(HQL)QueryException:无法解析属性:事务:类。Advicenote,如何解决此问题?我很困惑

Java Hibernate查询语言(HQL)QueryException:无法解析属性:事务:类。Advicenote,如何解决此问题?我很困惑,java,database,hibernate,orm,hql,Java,Database,Hibernate,Orm,Hql,Advicenote表的In_或_Out变量指示项目是从公司发出还是从公司发出,而交易有一个流量变量,它实际上是从系统发出或发出的项目的数量或数量。我想查询库存中物品的实际数量,方法是将Advicenote.in\u或\u Out和Transactions.Flow相乘,然后求和,并按items.Item\u ID对它们进行分组。如果您能提供帮助,我将不胜感激 下面,您可以看到我为此编写的HQL以及收到的错误消息: public List<ItemAndQuantity> getQu

Advicenote表的In_或_Out变量指示项目是从公司发出还是从公司发出,而交易有一个流量变量,它实际上是从系统发出或发出的项目的数量或数量。我想查询库存中物品的实际数量,方法是将Advicenote.in\u或\u Out和Transactions.Flow相乘,然后求和,并按items.Item\u ID对它们进行分组。如果您能提供帮助,我将不胜感激

下面,您可以看到我为此编写的HQL以及收到的错误消息:

public List<ItemAndQuantity> getQuantity()
        {
        List<ItemAndQuantity> quantity = new ArrayList<ItemAndQuantity>();



            try {
                session = sessionFactory.openSession();
                transaction = session.beginTransaction();
                Query query = session.createQuery("select sum(t.flow * a.inOrOut) from Advicenote a join a.Transactions t join t.Items i group by i.itemId");
                quantity = query.list();
                transaction.commit();
            } 
        catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
        }
        finally {
             session.close();}
             return quantity;
        }
事务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 Feb 9, 2019, 3:57:52 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="classes.Transactions" table="TRANSACTIONS" schema="APP" optimistic-lock="version">
        <id name="transactionsId" type="int" column="TRANSACTIONS_ID">
            <generator class="native" />
        </id>
        <property name="flow" type="int" column="FLOW" not-null="true" />
        <property name="netPrice" type="java.lang.Integer" column="NET_PRICE" />

        <many-to-one name="advicenote" class="classes.Advicenote"/>
        <many-to-one name="item" class="classes.Items" fetch="select" cascade="save-update" column="ITEM_ID" unique="true" not-null="true"/>
    </class>
</hibernate-mapping>
项目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">
<hibernate-mapping>
    <class name="classes.Items" table="ITEMS" schema="APP" optimistic-lock="version">
        <id name="itemId" type="int" column="ITEM_ID">
            <generator class="native" />
        </id>
        <property name="name" type="string" column="NAME" length="100"/>
        <property name="netPrice" type="java.lang.Integer" column="NET_PRICE"/>
        <property name="vatRate" type="java.lang.Integer" column="VAT_RATE"/>
        <many-to-one name="category" class="classes.Categories" fetch="select" column="CATEGORY_ID" not-null="true"/>
    </class>
</hibernate-mapping>
类别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 Feb 9, 2019, 3:57:52 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="classes.Categories" table="CATEGORIES" schema="APP" optimistic-lock="version">
        <id name="categoryId" type="int">
            <column name="CATEGORY_ID" />
            <generator class="native" />
        </id>
        <property name="name" type="string">
            <column name="NAME" length="100" />
        </property>
     <set name="items" table="ITEMS" inverse="false" cascade="all" lazy="false" fetch="select">
        <key>
            <column name="CATEGORY_ID" not-null="true" />
        </key>
        <one-to-many class="classes.Items" />
    </set>
    </class>
</hibernate-mapping>

问题在于a.交易 同时移除t.项 使用以下命令:-

select sum(t.flow * a.inOrOut) from Advicenote a join Transactions t join Items i group by i.itemId
您的查询:

select sum(t.flow * a.inOrOut) from Advicenote a join a.Transactions t join t.Items i group by i.itemId
应该是:

select sum(t.flow * a.inOrOut) from Advicenote a join a.transactions t join t.item i group by i.itemId

小写事务,项目也使用小写且不带“s”。它们引用的是字段,而不是类。

不幸地没有解决它:线程AWT-EventQueue-0 java.lang.IllegalArgumentException:org.hibernate.QueryException:无法解析属性:项:classes.Transactions[从类中选择sumt.flow*a.inOrOut.Advicenote a join classes.Transactions t join t.Items i按i.itemId分组]您仍然在使用t.Items再次检查我的查询我发誓我使用了ctrl+Cctrtl+v-d这个查询…但是仍然没有运气,当我使用这个时,我得到了另一个异常:线程AWT-EventQueue-0 javax.persistence.PersistenceException中的异常:org.hibernate.exception.sqlgrammareException:无法准备语句``java.sql.SQLSyntaxErrorException:Syntax错误:在第1行第143列遇到内部错误。您的注释仍然显示join t。我的查询中的Items是唯一的Items非常感谢您的解决方案,但是我遇到另一个异常:线程AWT-EventQueue-0 org.hibernate.LazyInitializationException中的异常:无法初始化代理[classes.Categories1]-没有Session@Fluellen你有类别映射文件吗?顺便说一句,Fluellen是你的真名吗?不,不是,你为什么要问?:我编辑了我的问题以包括类别映射文件我很好奇…我发现一个可能的问题,即项目和类别相互引用。可能是Items.category或Categories.Items should have inverse=true和/或lazy=true。@Fluellen不,实际上我认为问题在于您在关闭会话后正在使用查询结果。不要这样做。
<?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 Feb 9, 2019, 3:57:52 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="classes.Categories" table="CATEGORIES" schema="APP" optimistic-lock="version">
        <id name="categoryId" type="int">
            <column name="CATEGORY_ID" />
            <generator class="native" />
        </id>
        <property name="name" type="string">
            <column name="NAME" length="100" />
        </property>
     <set name="items" table="ITEMS" inverse="false" cascade="all" lazy="false" fetch="select">
        <key>
            <column name="CATEGORY_ID" not-null="true" />
        </key>
        <one-to-many class="classes.Items" />
    </set>
    </class>
</hibernate-mapping>
select sum(t.flow * a.inOrOut) from Advicenote a join Transactions t join Items i group by i.itemId
select sum(t.flow * a.inOrOut) from Advicenote a join a.Transactions t join t.Items i group by i.itemId
select sum(t.flow * a.inOrOut) from Advicenote a join a.transactions t join t.item i group by i.itemId