⑴ hibernate怎麼用查詢
1:hibernate數據查詢方式:有HQL方式,QBC方式,原生sql方式。HQL適合靜態查詢,QBC則適合較多的動態查詢。
A:HQL方式,支持條件查詢,連接查詢,分頁查詢,分組查詢,內置函數和自定義函數查詢(SUN(),MIN(),MAX()),子查詢,動態綁定參數查。
HQL語句定義如下:
String hql="from book";
Query query=session.createQuery(hql);
B:QBC方式,也就是QBC檢索方式。QBC通過Session類創建Criteria實例,通過不同方法進行檢索,實際上Criteria是用來裝載查詢條件的容器。QBC有很多條件函數,如:Resstictions.eq(),Resstictions.gt(),Resstictions.ge(),
Resstictions.le(),Resstictions.and(),Resstictions.or()等。
Criteria容器使用方法如下:
Criteria criteria=session.createCriteria(book.class);
criteria.add(Restrications.It("id",new Integer(4)));
List list=criteria.list();
C:原生SQL方式。不管是HQL還是QBC最終都要通過Hibernate來解析,把他們轉換成SQL語句進行對資料庫的操作。因為我們知道SQL可以在多平台之間使用。
使用原生SQL方式如下:
String sql="select {b.*} from book b"
SQLQuery squery=session.createSQLQuery(sql);
squery.addEntity("b",book.class);
List list=squery.list();
2:hibernate的關聯查詢
A:一對一關聯:
B:一對多,多對一關聯
C:多對多關聯
最後,要學hibernate,平時要多動手,慢慢積累經驗,成就感就會也大,這樣才能學而不厭。祝你學習進步。
⑵ Hibernate HQL左連接+子查詢怎麼寫
我要統計出 一個子查詢結果集的記錄條數(其中子查詢是動態可變的)。例如:select count(*) from ( select o from TabCompany as o )你上面這個句子在資料庫裡面喚廳彎伏悔運行了沒,一般在hibernate裡面的sql語和悶句沒有區別的。
⑶ SQL轉HQL如何解決from後面子查詢問題
Hibernate也有方法執行滾裂sql語句,像這種帶子查詢的語句hql好像執行不了,復雜我們一般都用sql語大滑閉讓清句,Hibernate執行sql如下:
Query query = session.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List list = query.list();
⑷ HQL怎麼查子查詢的條數
子查詢是SQL語句中非常重要世悔的功能特性,它可以在SQL語句中利用另外一條SQL語句的查詢結果,在Hibernate中HQL查詢同樣對子查詢功能提供稿返衡了支持。如下面代碼所示:
List list=session.createQuery(「from Customer c where 1>(select count(o) from c.orders o)」).list();
上面的程序查詢訂單數超過1的所有客戶,因此和上面子查詢HQL語句對應的SQL語句為:
Select * from Customer c where 1>(select count(o.id) from Order o where c.id=o.customer_ID);
如果子查詢返回多條記錄,則可以使用下面關鍵字:
all:表示子查詢語句返回的所有記錄
any:表示子查詢語句返回的任意一條結果
some:與」any」等價
in:與」=any」等價
exists:表示子查詢語句至少返回一條記錄
例如:查詢存在一條訂單價格大於100的客戶
From Customer c where 100>any(select o.price from c.orders o);
如果在子查詢中操作集合,HQL提供鍵做了一組操縱集合的函數和屬性:
size()函數和size屬性:獲得集合中元素的數量
minIndex()函數和minIndex屬性:對於建立了索引的集合獲得最小索引值(關於集合索引參考第一部分映射值類型集合)
minElement()函數和minElement屬性:對於包含基本類型的元素集合,獲得集合中值最小的元素
maxElement()函數和maxElement屬性:對於包含基本類型元素的集合,獲得集合中值最大的元素
element()函數:獲得集合中所有元素
例如:查詢訂單數大於0的客戶
From Customer c where size(c.orders)>0;或者From Customer c where c.orders.size>0;
以上HQL語句會生成類似如下的SQL語句:
Select * from customer c where 0>(select count(o.id) from order where o. customer_ID =c.id);
⑸ 怎麼用Hibernate寫SQL里的in式的子查詢
我型慎姿孝鎮寫個簡單的例子,樓主可以參考下public int getLogin(String username,String password)
{ String sql="卜絕select * from user_table where username=? and password=?";
SQLQuery query=getSession().createSQLQuery(sql).addEntity(UserTable.class);
query.setString(0,username);
query.setString(1,password);
return Integer.parseInt(query.uniqueResult().toString());
}
public static void main(String[] args) {
new UserTableDAO().getLogin("zhang","yuan");
}
⑹ hibernate訪問oracle分頁SQL語句rownum子查詢問題
因為oracle它支持廳拆明扮告窗口函數row_number(),並且它御螞的用法和在SQL server2005中的用法一樣。
⑺ hibernate中,用HQL查詢如何獲取資料庫中年齡欄位最大的那條記錄HQL語句怎麼寫
可以用子查詢:
hql語句
"from User where age=(select max(age) from User) "
相應數碧的sql語句是
SELECT * FROM USER WHERE AGE=(SELECT MAX(AGE) FROM USER);
⑻ 【高額懸賞】關於Hibernate子查詢以及Group by的一個問題
.....你要找每種componentName 的最大version.....直接敏羨用hql就悉拿虧行了:
String hql=「睜神from component t1 where t1.version =(select max(t2.version) from component t2 where t1.componentName=t2.componentName )」;
⑼ hibernate訪問oracle分頁SQL語句rownum子查詢問題
第一個是從第幾條開始,第二個是每頁幾條。
你看看你資料庫裡面的數據夠不夠分頁,你這樣只寫兩句就分頁是不夠的。
page = Paginator.showPage(, hql, paramValues, pageCurrent, pageSize);
/*
* 利用hql實現翻頁
*/
public static Page showPage(PersistentBaseDao p, String hql,
Object[] paramValues, int pageCurrent, int pageSize) {
// 入口參數校驗(無)
if (p == null) {
// log.debug("Paginator.p.hql is Empty");
}
if (hql.equals("") || hql == null) {
// log.debug("Paginator.showPage.hql is Empty");
}
if (p == null) {
// log.debug("Paginator.showPage.p is Empty");
}
PersistentBaseDao = (PersistentBaseDao) p;
// 如果當前頁大於>總的頁數,則讓當前頁等於總頁數
int tempPageCount =0;
if (paramValues == null) {
tempPageCount = .getPageCount(hql, (Object[]) null, pageSize);
} else {
tempPageCount= .getPageCount(hql, paramValues, pageSize);
}
if (pageCurrent > tempPageCount) {
pageCurrent = tempPageCount;
}
// 如果當前頁大於<1,則讓當前頁等於1
if (pageCurrent < 1) {
pageCurrent = 1;
}
// 調用.serarch()方法
if (paramValues == null) {
page = .search(hql, pageCurrent, pageSize);
} else {
page = .search(hql, paramValues, pageCurrent, pageSize);
}
// 為page對象設置當前頁的屬性
page.setPageCurrent(pageCurrent);
// 將page對象放在request對象中
return page;
}
/*
* 利用List實現翻頁
*/
@SuppressWarnings("unchecked")
public static Page showPage(List list, int pageCurrent, int pageSize) {
// 入口參數校驗(無)
if (list.isEmpty()) {
// log.debug("Paginator.showPage.list is Empty");
}
// 如果當前頁大於>總的頁數,則讓當前頁等於總頁數
if (pageCurrent > page.getPageCount()) {
pageCurrent = page.getPageCount();
}
// 如果當前頁大於<1,則讓當前頁等於1
if (pageCurrent < 1) {
pageCurrent = 1;
}
List ls = new ArrayList();
// 根據得到的list轉化為page對象
if (list.size() % pageSize == 0) {
page.setPageCount((list.size() / pageSize));
} else {
page.setPageCount((list.size() / pageSize) + 1);
}
page.setPageCurrent(pageCurrent);
page.setRecordCound(list.size());
int stag = (pageCurrent - 1) * pageSize;
int etag = pageCurrent * pageSize;
for (int i = stag; i < list.size() && i < etag; i++) {
ls.add(list.get(i));
}
page.setDataList(ls);
return page;
}
⑽ hibernate的關聯子查詢的問題
在hibernate中設置cascade的屬性為true,這表示級聯操作,當查亂兆詢嘩友租多一張表的時候,可以查詢與告察此表有關聯的表。