1. 程式人生 > >Hibernate SQL查詢時有重名欄位出現的問題

Hibernate SQL查詢時有重名欄位出現的問題

Hibernate 執行資料庫操作語句時會自動為欄位取別名。

問題:

SELECT a.name,ec.name resourcesName FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
使用jdbc直接查詢,結果正確。
使用hibernate的getSession().createQuery(sql)查詢,不報錯,但結果不正確,結果中的兩列的值都試a.name的值。

解決方案:

下面的方法就可以避免欄位名重複的問題:

List cats = sess.createSQLQuery( " select {cat.*} from cats cat

" ).addEntity( " cat " , Cat. class ).list();

這個查詢指定了:

SQL查詢語句,它帶一個佔位符,可以讓Hibernate使用欄位的別名.

查詢返回的實體,和它的SQL表的別名.

addEntity()方法將SQL表的別名和實體類聯絡起來,並且確定查詢結果集的形態。

addJoin()方法可以被用於載入其他的實體和集合的關聯.

List cats = sess.createSQLQuery(
"
select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id

" )
.addEntity(
" cat " , Cat. class )
.addJoin(
" kitten " , " cat.kittens " )
.
list();

原生的SQL查詢可能返回一個簡單的標量值或者一個標量和實體的結合體。

Double max = (Double) sess.createSQLQuery( " select max(cat.weight) as maxWeight from cats cat " )
.addScalar(
" maxWeight " , Hibernate.DOUBLE);
.uniqueResult();

除此之外,你還可以在你的hbm

檔案中描述結果集對映資訊,在查詢中使用。

List cats = sess.createSQLQuery(
"
select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id " )
.setResultSetMapping(
" catAndKitten " )
.
list();

命名SQL查詢可以在對映文件中定義查詢的名字,然後就可以象呼叫一個命名的HQL查詢一樣直接呼叫命名SQL查詢.在這種情況下,我們不需要呼叫addEntity()方法.

< sql - query name = " persons " >
<
return alias = " person " class = " eg.Person " />
Select person.NAME AS {person.name},person.AGE AS {person.age},person.SEX AS {person.sex} FROM PERSON person Where person.NAME LIKE :namePattern
</
sql - query >

List people = sess.getNamedQuery( " persons " ).setString( " namePattern " , namePattern)
.setMaxResults(
50 )
.
list()

相關推薦

Hibernate SQL查詢時有出現的問題

Hibernate 執行資料庫操作語句時會自動為欄位取別名。 問題: SELECT a.name,ec.name resourcesName FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id 使用jdbc

sql 查詢除某一外的所有

方法1.     直接寫         select   列1,列2...列n   from   你的表           方法2.     從syscolumns中提出欄位資訊,用生成SQL語句的方法         declare   @sql   varchar(8

SQL 查詢語句有中文,查不到結果,如何解決?

每個 Microsoft® SQL Server™ 排序規則都有一個對錶示 char、varchar 和 text 值中的每個字元定義位模式進行定義的內碼表。可為個別的列和字元常量指派不同的內碼表。客戶端計算機使用與作業系統區域設定相關聯的內碼表解釋字元位模式。有很多種不同的內碼表。一些字元出現在某些內碼表上

distinct使SQL查詢除去重複的

sql語句去重,distict的用法: select distinct 欄位名 from [表名] Sql = "Select * from (Select max(可輸入順序的欄位) as indexfield,要去重複欄位名 From 資料表 Where  條件 Group by   要去重複欄位名)

SQL 查詢的結果某個是Null,用預設的值代替

如果查詢的結果某個欄位是Null,用預設的值代替。 1、)Sql server中: select   case   when   欄位名1   is   null                                  then   替代值           

sql中連線多個結果集查詢符合要求的

1.sql中將查詢到的結果集作為一個表去連線多個結果集查詢想要的欄位,適用於查詢複雜邏輯的欄位; 舉例: select dd.base_grade_value,count(distinct dd.userid) from  (select cc.school_id,bb.us

hive查詢時怎麼顯示

在hive查詢中我們發現hive的查詢輸出不顯示列名,怎麼解決呢? 解決辦法:進入hive cli後: set hive.cli.print.header=true; hive> select *

帝國CMS,使用sql語句查詢時,有些不顯示

使用sql查詢資料時,有些欄位不顯示,比如<?=$bqsr[classname]?>顯示為空,或者其他的。 [e:loop={'select classid,classpath,classname from [!db.pre!]enewsclass where

hibernate查詢資料庫char型別時只返回一個字元

hibernate查詢資料表char型別欄位只返回一個字元 在oracle或sqlServer下會遇到,查詢資料表字段型別為char,如果使用Hibernate原生SQL去執行查詢,往往只會返回 一

MySQL查詢根據重複內容只顯示最新的一條

例: SELECT * FROM user_bindcard_info WHERE (id IN ( SELECT MAX(id) FROM user_bindcard_info WHERE (vip_id IN(1000000006,1000000009,654323)

sql精確查詢逗號隔開的

--先建立一個函式,用來拆分欄位值Create Function f_split1(@SourceSql Varchar(8000),@StrSeprate Varchar(2)) Returns @temp Table(id Int Identity(1,1), col Varchar(100)) As b

hibernate生成表中有BLOB的javabean,hql查詢出現無效列型別異常

出現異常:java.sql.SQLException: 無效的列型別: getInt not implemented for class oracle.jdbc.driver.T4CClobAccessorjava 問題背景:oracle中有一張表中有個欄位型別為BLOB,

Oracle資料庫裡面查詢字串型別的不為空和為空的SQL語句:

摘要:近期專案中,在做高階查詢的時候有個條件是根據選擇的欄位,然後再選擇欄位的值為空和不為空做查詢,在寫SQL語句的時候費了很長時間,現在記錄一下,方便日後檢視: 一:查詢字串型別的欄位的值不為空的S

SQL】一條查詢中統計同一不同記錄值數量(頻數統計)的寫法

     SQL查詢中經常會碰到需要在一條語句中統計某欄位中不同記錄值的數量,即頻數統計。在看《高效能MySQL》(https://book.douban.com/subject/23008813/)這本“葵花寶典”時看到裡面總結了兩種方法,我在這裡再整理記錄一下:一種是

查詢某個表的型別,長度及說明,查詢主鍵資訊,查詢自增列資訊的儲存過程

create PROCEDURE [dbo].[ziduan] /*  function:查詢某個表的欄位名,欄位型別,長度及欄位說明,並asc排序;查詢主鍵資訊;查詢自增列資訊  */ (@biaoming nvarchar(50) )  ASSET NOCOUNT ON

SQL語句怎麼對單個,並且要顯示所有列(也可用於去後,顯示最新資料)

取最大id: select * from 表名  where 主鍵 in(select max(主鍵)   from 表名 group by 要去重的欄位 )  取最新時間:(時間並列會全部展示) select * from 表名  where date  in(sel

SQL 如何查詢text,ntext型別為空不為null ?

我們知道,在sql語句中,如果查詢某個文字欄位值為空的,可以用select * from 表 where 欄位='' ,但是如果這個欄位資料型別是text或者ntext,那上面的sql語句就要出錯了。 下面是個人總結的幾種常用方法: 1. select * from 表 w

Mysql查詢某個出現的次數並按倒序排列

問題:mysql資料庫表名address,查詢城市city欄位出現的次數並按倒序排列   查詢語句 select city,count(*) from address group by city order by count(*)  desc 執行結果如圖,按查詢欄位(城

oracle資料庫查詢某個表的資訊

(1)查詢整個資料庫所有表的欄位 select t.column_name from user_col_comments t;(一般建議去執行,因為資料庫表過多執行起來會非常的慢) (2)查詢特定表名的表字段 select t.column_name, t.column_name&nbs

sql server怎麼設定ID為自增

①開啟要設定的資料庫表,點選要設定的欄位,比如id,這時下方會出現id的列屬性表 ②列屬性中,通過設定“標識規範”的屬性可以設定欄位自增,將“是標識”的值改為是,即成功設定id欄位為自增欄位 ③注意! 能夠設定ID欄位自增的欄位必須是可自增的,比如int,bigint型別,而varch