2014-09-23 67 views
1

我在使用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,电子邮件和状态。

回答

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

user2900314,我不是你做什么确切的变化o修复的问题,你说清楚',我们需要使用不同的标签叫什么不同的标签?你也在你的答案中提供了2'',其中1与你的问题相符。你能否提供更多关于你如何解决这个问题的细节? – Chaitanya 2014-09-23 05:19:52

+0

@Chaitanya编辑中出现了一些问题。我现在修复了它,现在查看它,并让我知道是否需要更多的说明。 第一个是我们有问题,第二个是纠正之一。 – User27854 2014-09-23 10:45:52

+0

谢谢,现在很清楚。 – Chaitanya 2014-09-23 11:32:24

0

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

< SQL查询的名称= “ActiveCustomers”>
<回报别名为 “CTS” 级= “客户”/>

选择
cts.cid AS {cts.cid},
cts.cname AS {cts.cname},
cts.email AS {cts.email},

cts.status {cts.status}
客户CTS
WHERE cts.status =:ST </SQL查询>

+0

没有,这不起作用,整个查询必须重写。 请阅读我上面列出的答案。 – User27854 2014-09-23 05:11:35

+0

是的。你也必须在这里使用标量。 – 2014-09-23 05:34:20