【问题标题】:Hibernate: Unexpected Error while using Named Query休眠:使用命名查询时出现意外错误
【发布时间】:2014-09-23 03:41:12
【问题描述】:

当我尝试在 hibernate 中使用命名查询显示表的少量内容时出现错误。我曾尝试寻找答案,但没有成功。代码如下。

<sql-query name="ActiveCustomers">
<return alias="cts" class="Customer"/>
    SELECT 
        cts.cid AS {cts.cid},
        cts.cname AS {cts.cname},
        cts.email AS {cts.email},           
        cts.status {cts.status}
    FROM Customers cts
    WHERE cts.status=:st
</sql-query>

我从客户端调用它,如下所示:

SessionFactory sf=CHibernateUtil.getSessionFactory();
        Session session=sf.openSession();
        tx=session.beginTransaction();

        list=session.getNamedQuery("ActiveCustomers").setString("st","Active").list();
        for(Customer c:list){
            System.out.println(c);
        }

        tx.commit();
        session.close();

但我收到此错误:

休眠:

    SELECT 
        cts.cid AS cid0_,
        cts.cname AS cname0_0_,
        cts.email AS email0_0_,         
        cts.status status0_0_
    FROM Customers cts
    WHERE cts.status=?



org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.exception.ErrorCodeConverter.handledNonSpecificException(ErrorCodeConverter.java:92)
.
.
 Caused by: java.sql.SQLException: Column 'city0_0_' not found.

但是如果我添加表的所有列,那么它就可以工作。但这不是我的要求。我的要求是只显示 cid、cname、email 和状态。

【问题讨论】:

    标签: java mysql sql hibernate


    【解决方案1】:

    终于明白了。

    当我们使用下面的语法时,我们需要指定整个类变量,返回类型也是对象类型或类类型。

    <sql-query name="ActiveCustomers">
    <return alias="cts" class="Customer"/>
    SELECT 
        cts.cid AS {cts.cid},
        cts.cname AS {cts.cname},
        cts.email AS {cts.email},           
        cts.status {cts.status}
    FROM Customers cts
    WHERE cts.status=:st
    </sql-query>
    

    另一方面,当我们想要选择少数或特定的列时,我们需要使用一个名为

    的不同标签
    <return scalar ... 
    

    这里的返回类型是对象数组,我们需要从该对象数组中打印出值。现在为了满足我们的要求,上面的查询可以重写如下:

    还要注意选择语句的语法差异。

    <sql-query name="ActiveCustomers">
    <return-scalar column="cid" type="string"/>
    <return-scalar column="cname" type="string"/>
    <return-scalar column="email" type="string"/>
    <return-scalar column="status" type="string"/>
    
        SELECT 
            cts.cid AS cid,
            cts.cname AS cname,
            cts.email AS email,         
            cts.status status
        FROM Customers cts
        WHERE cts.status=:st
    </sql-query>
    

    客户端的变化是我们读取数据的方式..

     for(Object obj[]:aclist){
                for(Object o:obj){
                    System.out.println(o);
                }
            }
    

    【讨论】:

    • user2900314,我不清楚你为解决这个问题做了什么确切的改变,你说we need to use a different tag called 那个不同的标签是什么?此外,您在答案中提供了 2 &lt;sql-query&gt;,其中 1 与您的问题匹配。您能否提供有关您如何解决此问题的更多详细信息?
    • @Chaitanya 编辑中出现了一些问题。我现在已经修复了,现在看看,如果您需要更多说明,请告诉我。第一个 是我们有问题,第二个是更正的。
    【解决方案2】:

    可能在下面您缺少 AS (cts.status AS {cts.status})




    SELECT
    cts.cid AS {cts.cid},
    cts.cname AS {cts.cname},
    cts.email AS {cts.email},

    cts.status {cts.status}
    来自客户 cts
    WHERE cts.status=:st

    【讨论】:

    • 不行,整个查询都得重写。请阅读我上面列出的答案。
    • 是的。你也必须在这里使用标量。
    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多