2014-09-23 73 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