[Hibernate] 使用CreateSQLQuery第一個字串欄位被吃掉問題

  • 1814
  • 0
  • 2013-10-14

摘要:[Hibernate] 如何使用CreateSQLQuery第一個字串欄位被吃掉問題

我嘗試使用CreateSQLQuery查詢數筆資料

 

查詢的資料表 [PC],所有的資料如下

ID PcName IP OS
1 Eric-PC 192.168.2.11 Windows 7
2 Rose-PC 192.168.2.101 Windows 7
3 Even-PC 192.168.2.33 Windows XP
4 Huang-PC 192.168.2.45 Windows 7
5 Kevin-PC 192.168.2.10 Windows 8

 

 

接著開始撰寫程式碼,只要輸出兩個欄位,分別為PcNameIP,範例如下

 


String osName = "Windows 7";

String sql = "SELECT PcName, IP FROM PC WHERE OS= :osType ";

//因為不透過Hibernate直接轉換成對應的模型,所以用Object array來接
List items = session.CreatSQLQuery(sql).setString("osType", osName).list();

for(Object[] item : items)
{
    //一個蘿蔔一個坑,轉型對應
    String name = item[0].toString();
    String ip = item[1].toString();
}

 

執行後輸出結果

E 192.168.2.11
R 192.168.2.101
H 192.168.2.45

 

筆數是正確了,但為什麼第一個欄位(電腦名稱)的結果怪怪的,它只印出了第一個字元

 

 

 

我拜了大神之後求得兩種解法

 

1. 用SQL的Convert


//改一下SQL語法
String sql = "SELECT CONVERT(nvarchar(100), PcName) AS PcName, IP FROM PC WHERE OS= :osType ";

 

不過如果字串長度剛好超過Convert所定義的數值的話可能還是會有問題,簡單的或許還可以這樣用

 

2. 使用addScalar協助定義欄位類型


List items = session.CreatSQLQuery(sql)
                                    .setString("osType", osName)
                                    .addScalar("PcName", Hibernate.STRING)
                                    .addScalar("IP", Hibernate.STRING)
                                    .list();

 

修改寫法之後我再轉型它就不會再把第一個欄位的結果給吃掉了

 

筆記!

 

參考

hibernate query returns only first character of string

What does addScalar do?