Hibernate:使用命名查询时出现意外错误

时间:2014-09-23 03:41:12

标签: java mysql sql hibernate

当我尝试在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,电子邮件和状态。

2 个答案:

答案 0 :(得分: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 ... 

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

另请注意select语句的语法差异。

<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);
            }
        }

答案 1 :(得分:0)

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

&lt; sql-query name =&#34; ActiveCustomers&#34;&gt;
&lt; return alias =&#34; cts&#34;类=&#34;顾客&#34; /&GT;
   
选择      
cts.cid AS {cts.cid},      
cts.cname AS {cts.cname},      
cts.email AS {cts.email},
      
cts.status {cts.status}   
来自客户cts    
WHERE cts.status =:st &LT; / SQL查询&GT;