Ⅰ hibernate的三種查詢方式
1.1、sql概述
HQL是Hibernate Query Language的縮寫,提供更加豐富靈活、更為強大的查詢能力;HQL接近SQL`語句查詢語法。
完整的HQL語句形式如下:
select | update | delete … from … where … group by … having … order by … asc|desc
其中的update、delete為Hibernate3中所新添加的功能,可見HQL查詢非常類似於標准SQL查詢。HQL查詢在整個Hibernate實體操作體系中占核心地位。
String hql = "HQL語句";
Query query = session.createQuery(hql);
List list = query.list(); //查詢得到多個實體對象集合
Object result = query.uniqueResult(); //查詢得到一個實體對象
int x = query.executeUpdate(); //執行update或delete語句,返回數據表受影響行數
1.2、實體查詢
查詢過程中表名使用類名,列名使用屬性名,類名和屬性名稱區分大小寫
String hql="from Users";//from 實體類類型名稱
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、帶where的查詢
Query query = session.createQuery("from Users where uid=3");
Users user = (Users) query.uniqueResult();//uniqueResult 單一對象
System.out.println(user);
Query query = session.createQuery("from Users where uid>5");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、屬性查詢
查詢部分屬性
String hql="select u.uid,u.uname,u.upwd from Users u where u.uname='張三'";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
String hql="select new Users(u.uname,u.upwd) from Users u where u.uname='張三'";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.4、實體的更新和刪除
從hibernate 3版本開始才支持
//更新
String hql="update Users set uname='王五',upwd='321' where uid=3";
int res = session.createQuery(hql).executeUpdate();
//刪除
String hql="delete from Users where uid=3";
int res = session.createQuery(hql).executeUpdate();
/*
返回值結果:
正整數:表受影響的行數據
0: 語句正常執行,但沒有行受影響
負整數:通常是-1,執行HQL語句是一條查詢語句
*/
HQL語句不能做添加
1.5、分組與排序
排序
處理方式和SQL語句中的排序是一樣的
String hql="from Users order by uid";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
order by語句只能出現在語句的最後位置
分組
處理方式和SQL語句中分組查詢相同
分組語句需要處理篩選,只能使用having語句,而不能使用where語句。
String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno";
String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno having count(e)>=5";
1.6、參數綁定
使用佔位參數
String hql="from Users where uid=? or uname=?";
Query query = session.createQuery(hql);
//索引從0開始
query.setInteger(0, 3);//query.setParameter(0, 3);
query.setString(1, "張三");//query.setParameter(1, "張三");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
使用參數名稱
String hql = "from Users where uid=:no1 or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger("no1", 1);
query.setInteger("no2", 3);
//....
可以使用點位參數和名稱參數混合使用
String hql = "from User where uid=? or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger(0, 7788);
query.setInteger("no2", 7566);
//....
//使用點位參數和名稱參數混合使用,所有點位參數必須放在前面,一旦有名稱參數出現,其後將不能再出現佔位參數
1.7、連接查詢
--SQL語句:查詢員工姓名、薪資、部門名稱
SELECT ENAME,SAL,DNAME
FROM EMP e JOIN DEPT d ON e.DEPTNO=d.DEPTNO
SELECT ENAME,SAL,DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO
沒有on語句
能被連接到查詢中的必須是主查詢對象的子屬性
String hql="SELECT e.ename, e.sal, e.dept.dname FROM Emp e";
//HQL連接查詢
String hql="SELECT e.ename, e.sal, d.dname FROM Emp e JOIN e.dept d";
String hql = "SELECT e FROM Emp e JOIN e.dept"; //JOIN將沒有意義
String hql = "FROM Emp e JOIN e.dept";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
//List集合中的數組中會保存兩個元素:
//0:主數據(Emp)
//1:從數據(Dept)
//查詢編號為7788的員工信息,同時將對應的dept信息和manager信息查詢並保存在對應的子屬性中
String hql = "FROM Emp e JOIN FETCH e.dept d JOIN FETCH e.manager m WHERE e.empno=7788";
Query query = session.createQuery(hql);
Emp emp = (Emp) query.uniqueResult();
System.out.println(emp);
System.out.println(emp.getManager());
System.out.println(emp.getDept());
1.8、分頁
String hql = "from Users";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(2);
2、QBC查詢
QBC(Query By Criteria)查詢就是通過使用Hibernate提供的Query By Criteria API來查詢對象,這種API封裝了SQL語句的動態拼裝,對查詢提供了更加面向對象的功能介面。
QBC查詢最重要的三個類:
Restrictions 條件限制
Projections 列設射
Order 排序
2.1、查詢實現
Criteria criteria = session.createCriteria(Users.class);
//session.createCriteria("entity.Users");
//session.createCriteria(Users.class, "別名");
List<Dept> list = criteria.list();
//查詢單行結果(如果結果有兩行或更多,會報錯)
Object uniqueResult = criteria.uniqueResult();
2.2、Projections 列投射
語法:
//查詢uname屬性
Criteria criteria = session.createCriteria(Users.class);
PropertyProjection property = Projections.property("name");
criteria.setProjection(property);
List<Object> result = criteria.list();
//查詢uname, upwd屬性
Criteria criteria = session.createCriteria(Users.class);
//1.創建投射列表
ProjectionList projectionList = Projections.projectionList();
//2.向投射列表中添加列投射
PropertyProjection property1 = Projections.property("uname");
PropertyProjection property2 = Projections.property("upwd");
projectionList.add(property1).add(property2);
//3.將投射列表設置到准則中
criteria.setProjection(projectionList);
List<Object> result = criteria.list();
返回值類型 方法名稱 描述
PropertyProjection Projections.property 指定某屬性
AggregateProjection Projections.avg 求平均值
CountProjection Projections.count 統計某屬性的數量
CountProjection Projections.countDistinct 統計某屬性不同值的數量
PropertyProjection Projections.groupProperty 指定某個屬性為分組屬性
AggregateProjection Projections.max 求最大值
AggregateProjection Projections.min 求最小值
ProjectionList Projections.projectionList 創建一個ProjectionList對象
Projection Projections.rowCount 查詢結果集中的記錄條數
AggregateProjection Projections.sum 求某屬性的合計
2.3、Restrictions 條件限制
語法:
Criteria criteria = session.createCriteria(Users.class);
Criterion notNull = Restrictions.isNotNull("comm");
criteria.add(notNull); //添加一個條件(如果添加了多個條件,默認條件之間使用and連接)
List<Users> list = criteria.list();
返回值類型 方法名稱 描述
SimpleExpression Restrictions.eq 等於(equal)
Criterion Restrictions.allEq 使用Map,Key/Valu進行多個等於的比對
SimpleExpression Restrictions.gt 大於(great than)
SimpleExpression Restrictions.ge 大於等於(great than or equal)
SimpleExpression Restrictions.lt 小於(less than)
SimpleExpression Restrictions.le 小於等於(less than or equal)
Criterion Restrictions.between 對應SQL的between
SimpleExpression Restrictions.like 對應SQL的like
Criterion Restrictions.in 對應SQL的in
LogicalExpression Restrictions.and and關系
LogicalExpression Restrictions.or or關系
Criterion Restrictions.isNull 為空
Criterion Restrictions.sqlRestriction SQL限定查詢
Criterion Restrictions.not 取反
2.3、Order排序
語法:
Criteria criteria = session.createCriteria(Dept.class);
criteria.addOrder(Order.asc("name"))
.addOrder(Order.desc("loc"));
//SELECT * FROM DEPT ORDER BY name ASC, loc DESC
返回值類型 方法名稱 描述
Order Order.asc(String propertyName) 升序
Order Order.desc(String propertyName) 降序
2.4、分頁查詢
Criteria criteria = session.createCriteria(Dept.class);
int pageNum = 2, pageSize = 5;
criteria.setFirstResult((pageNum-1)*pageSize); //查詢起始行下標
criteria.setMaxResults(pageSize); //查詢的最大行數
List list = criteria.list();
//setFirstResult方法和setMaxResults方法同樣可以在SQLQuery及Query類型上使用
3、原生SQL查詢
1、查詢
String sql = "select uid,uname,upwd from _users";
List list = session.createSQLQuery(sql).list();
for(Object obj : list){
System.out.println(obj);
}
2、 addEntity()
String sql = "select uid,uname,upwd from _users";
// addEntity()可以告訴Hibernate你想要封裝成對象的類型,然後自動為你封裝
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
List<User> list = query.list();
for(Users user : list){
System.out.println(user.getUname());
}
3、 uniqueResult
String sql = "select uid,uname,upwd from _users where uid = 2";
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
Users user = (Users) query.uniqueResult();//返回單一對象
System.out.println(user.getUname());
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亞馬遜測評 www.yisuping.cn
深圳網站建設www.sz886.com
Ⅱ hibernate sql 條件查詢問題。
可以如下進行查詢:
Criteria criteria = session.createCriteria(User.class);
List users = criteria.list();
for(Iterator it = users.iterator(); it.hasNext(); ) {
User user = (User) it.next();
System.out.println(user.getId() +
" /t " + user.getName() +
"/" + user.getAge());
}
Ⅲ 現在有個需求,用的是hibernate,需要在hibernate攔截器中對查詢的sql進行where條件拼接
這個寫起來很麻煩,提供解決思路。
1、在web.xml里實現攔截器配置。針對於某一個連接跳轉的。
2、攔截器功能實現,拿到參數。實現需要反射進行實現,同時要保證線程安全。
3、參數處理放到Session里。
4、在實際SQL語句中查詢。
如果跟spring集成的話,建議使用spring的AOP,進行動態代理實現。 進行初期處理。
Ⅳ Hibernate 的HQL和sql有什麼區別
HQL:Hibernate Qusery Language,如果你已經熟悉它,就會發現它跟SQL非常相像。不過 你不要被表面的假象迷惑,HQL是面向對象的(OO,用生命的眼光看待每一個對象,他們是如此 鮮活)。如果你對JAVA和SQL語句有一定了解的話,那麼HQL對你簡直易如反掌,你完全可以利用在公車上的時間掌握它。 以下從幾個方面進行慢慢深入: 1。大小些敏感
大家知道Query是對大小寫不敏感的,但是在HQL(前面提到它是OO的)中那麼對象類的名稱和屬性確實大小寫敏感的(符合java編程語法)。
如:sElect cat.name from Cat as cat和select cat.name from Cat as cat是一樣的
但是:
sElect cat.name from CAT as cat和select cat.name from Cat as cat確實不一樣的。 2。from語句
最簡單的:
from eg.Cat
它只是簡單的返回所有eg.Cat的實例
通常我們此時會為eg.Cat其個別名,因為在query的其餘部分可能會用到(參看上邊關於大小寫
敏感時的例子情形),如:
from eg.Cat as cat 這里as可以省略。
上邊只是單表查詢,多表的情況如下寫法:
from eg.Cat,eg.Dog
from eg.Cat as cat,eg.Dog as dog 3。join相關
(inner) join
left (outer) join
right (outer) join
full join
HQL同樣對SQL中的這些特性支持
下面插播一個小話題,關於上邊的那些特性,我一直都沒怎麼用,今天既然說到這里,就想
把上邊的幾個特性的用法說一下,也算對自己的一個補充:
假設有兩個表:部門、員工,下面列舉一些數據:
員工(Employee):
ID Name DepNo
001 Jplateau 01
002 Jony 01
003 Camel 02
部門(Department):
ID Name
01 研發部
02 營銷部 在Hibernate中我們操縱的都是對象,所以我們操縱的是部門類和員工類
1).(inner) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee join Department as department on employee.DepNo=
department.ID (注意到條件語句我用on 沒有用where)
那麼執行結果是什麼呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研發部
002 Jony 01 研發部 2).left (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee left join Department as department on employee.DepNo=
department.ID
那麼執行結果又該是什麼呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研發部
002 Jony 01 研發部
003 Camel null null
{就是說此時我要已第一個表的記錄多少為准,第二個表中沒有相應紀錄的時候填充null}
3). right (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID
那麼執行結果又該是什麼呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研發部
002 Jony 01 研發部
null null 02 營銷部
{就是說此時我要已第二個表的記錄多少為准,第一個表中沒有相應紀錄的時候填充null} 4。select語句
就是要確定你要從查詢中返回哪些對象或者哪些對象的屬性。寫幾個例子吧:
select employee form Employee as employee
select employee form Employee as employee where employee.Name like 'J%'
select employee.Name form Employee as employee where employee.Name like 'J%'
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID select elements(employee.Name) from Employee as employee
(不明白elements到底是做什麼用的?望給於說明)
等等
5。數學函數
JDO目前好像還不支持此類特性。
avg(...), sum(...), min(...), max(...) count(*) count(...), count(distinct ...), count(all...) 其用法和SQL基本相同 select distinct employee.name from Employee as employee
select count(distinct employee.name),count(employee) from Employee as employee 6。polymorphism (暫時不知道如何解釋?)
from com.test.Animal as animal
不光得到所有Animal得實例,而且可以得到所有Animal的子類(如果我們定義了一個子類Cat)
一個比較極端的例子
from java.lang.Object as o
可以得到所有持久類的實例 7。where語句
定義查詢語句的條件,舉幾個例子吧:
from Employee as employee where employee.Name='Jplateau'
from Employee as employee where employee.Name like 'J%'
from Employee as employee where employee.Name like '%u'
在where語句中「=」不光可以比較對象的屬性,也可以比較對象,如:
select animal from com.test.Animal as animal where animal.name=dog 8。表達式 在SQL語句中大部分的表達式在HQL中都可以使用:
mathematical operators +, -, *, / binary comparison operators =, >=, <=, <>, !=, like logical operations and, or, not string concatenation || SQL scalar functions like upper() and lower() Parentheses ( ) indicate grouping in, between, is null JDBC IN parameters ? named parameters :name, :start_date, :x1 (這種應該是另一種"?"的變通解決方法) SQL literals 'foo', 69, '1970-01-01 10:00:01.0' Java public static final constants eg.Color.TABBY 其他不必解釋了,在這里我只想對查詢中的參數問題說明一下:
大家知道在SQL中進行傳遞參數進行查詢的時候,我們通常用PreparedStatement,在語句中寫一大堆的「?」,
在hql中也可以用這種方法,如:
List mates = sess.find(
"select employee.name from Employee as employee " +
"where employee.Name=? ",
name,
Hibernate.STRING
);
(說明:上面利用Session里的find方法,在hibernate的api Session中重載了很多find方法,它可以滿足你多種形式的查詢)
上邊是一個參數的情形,這種情況下緊接著引入參數和定義參數的類型,當為多個參數,調用另一個find方法,它的後兩個
參數都是數組的形式。 還有另外一種方法來解決上邊的問題,JDO也有這樣的方法,不過和hibernate的表現形式上有差別,但他們兩個骨子裡卻是
一樣的,如:
Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
q.setString("name", "Jplateau");
//當有多個參數的時候在此逐一定義
Iterator employees = q.iterate(); 9。order 語句
和sql語句沒什麼差別,如:
select employee.name from Employee as employee where employee.Name like 'J%' order by employee.ID desc (或者asc) 10。group by 語句
同樣和sql語句沒什麼差別,如: select employee.name,employee.DepNo from Employee as employee group by employee.DepNo select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) from eg.Foo foo group by foo.id
{Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects.}
誰幫我解釋一下上邊兩句,謝過! 11。子查詢
hibernate同樣支持子查詢,寫幾個例子: from eg.Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from eg.DomesticCat cat )
Ⅳ 請教Hibernate中CriteriaQuery可以使用原生sql作為排序條件么
Hibernate對原生SQL查詢的支持和控制是通過SQLQuery介面實現的,這種方式彌補了HQL、Criterion查詢的不足,在操作和使用上往往更加的自由和靈活,如果使用得當,資料庫操作的效率還會得到不同程度的提升。
Hibernate對原生
SQL查詢的支持和控制是通過SQLQuery介面實現的。通過Session介面,我們能夠很方便的創建一個SQLQuery(SQLQuery是一個介面,在Hibernate4.2.2之前,默認返回的是SQLQuery的實現類——SQLQueryImpl對象,在下文中出現的SQLQuery如非註明,都是指該子類)對象來進行原生SQL查詢:
session.createSQLQuery(String sql);
SQLQuery實現了Query介面,因此你可以使用Query介面中提供的API來獲取數據。
最簡單的示例
//獲取所有查詢結果
session.createSQLQuery("select * from note").list();
//僅獲取第一條結果
session.createSQLQuery("select * from note where id = 1").uniqueResult();
使用預處理SQL
預純州處理SQL的好處自然不必多說,除了眾所周知的能夠防止SQL注入攻擊外,還能夠在一定程度上提高SQL的查詢效率。SQLQuery提供了眾多的介面來分別設置不同類型的參數,諸如setBigDecimal、setBinary、setDouble等,詳參SQLQuery的JavaDoc,此處不再贅述。這里僅重點說一下通用的SQL參數設置介面setParameter。
如下代碼示範了如何使用SQLQuery執行預處理SQL:
SQLQuery query = session.createSQLQuery("select * from note where id = ?");
//設置第一個參數的值為12,即查詢ID=12的note
query.setParameter(0, 12);
List list = query.list();
...
這里需要註明一點,無論是通過不同類型參數的設置介面來設置SQL參數,還是通過setParameter來設置參數,下標都是從團仿0開始的,而不是從1開始的!
使用自定義的結果轉換器處理查詢結果
SQLQuery
介面預留了setResultTransformer介面以實現使用用戶自定義的ResultTransformer結果集轉換器處理查詢結果。
ResultTransformer介面非常簡單,只有兩個方法,分別用來轉換單行數據和所有結果數據。經過自定義ResultTransformer生成的實體,並未加入Session,因此是非受管實體。
塌褲纖如下代碼,示範了如何將單行數據裝入LinkedHashMap對象中:
query.setResultTransformer(new ResultTransformer() {
@Override
public Object transformTuple(Object[] values, String[] columns) {
Map<String, Object> map = new LinkedHashMap<String, Object>(1);
int i = 0;
for(String column : columns){
map.put(column, values[i++]);
}
return map;
}
@Override
public List transformList(List list) {
return list;
}
});
如果不設置自定義的ResultTransformer轉換器,則Hibernate將每行返回結果的數據按照結果列的順序裝入Object數組中。
這里介紹一個工具類:Transformers,它提供了一些常用的轉換器,能夠幫助我們快速轉換結果集,如Transformers.aliasToBean(Note.class)能夠將查詢結果依別名注入到Note實體中。
使用標量
使用SQLQuery執行原生SQL時,Hibernate會使用ResultSetMetadata來判定返回的標量值的實際順序和類型。如果要避免過多的使用ResultSetMetadata,或者只是為了更加明確的指名返回值,可以使用addScalar()。
session.createSQLQuery("select * from note where id = 1")
.addScalar("id", LongType.INSTANCE)
.addScalar("name", StringType.INSTANCE)
.addScalar("createtime", DateType.INSTANCE);
這個查詢指定了SQL查詢字元串,要返回的欄位和類型.它仍然會返回Object數組,但是此時不再使用ResultSetMetdata,而是明確的將id,name和
createtime按照Long,
String和Date類型從resultset中取出。同時,也指明了就算query是使用*來查詢的,可能獲得超過列出的這三個欄位,也僅僅會返回這三個欄位。
對全部或者部分的標量值不設置類型信息也是可以的:
session.createSQLQuery("select * from note where id = 1")
.addScalar("id")
.addScalar("name")
.addScalar("createtime", DateType.INSTANCE);
沒有被指定類型的欄位將仍然使用ResultSetMetdata獲取其類型。注意,欄位不區分大小寫,同時不能夠指定不存在的欄位!
關於從ResultSetMetaData返回的java.sql.Types是如何映射到Hibernate類型,是由方言(Dialect)控制的。假若某個指定的類型沒有被映射,或者不是你所預期的類型,你可以通過Dialet的registerHibernateType調用自行定義。
如果僅指定了一個scalar,那麼...
Date createTime = (Date)session.createSQLQuery("select * from note where id = 1")
.addScalar("createtime", DateType.INSTANCE)
.uniqueResult();
如果我們的SQL語句使用了聚合函數,如count、max、min、avg等,且返回結果僅一個欄位,那麼Hibernate提供的這種提取標量結果的方式就非常便捷了。
實體查詢
上面的查詢都是返回標量值的,也就是從resultset中返回的「裸」數據。下面展示如何通過addEntity()讓原生查詢返回實體對象。
session.createSQLQuery("select * from note where id = 1").addEntity(Note.class);
session.createSQLQuery("select id,name,createtime from note where id = 1").addEntity(Note.class);
這個查詢指定SQL查詢字元串,要返回的實體。假設Note被映射為擁有id,name和createtime三個欄位的類,以上的兩個查詢都返回一個List,每個元素都是一個Note實體。
假若實體在映射時有一個many-to-one的關聯指向另外一個實體,在查詢時必須也返回那個實體,否則會導致發生一個"column
not found"的資料庫錯誤。這些附加的欄位可以使用*標注來自動返回,但我們希望還是明確指明,看下面這個具有指向Dog的many-to-one的例子:
session.createSQLQuery("select id,note,createtime,author from note where id = ?").addEntity(Note.class);
author欄位即為Note實體和Author實體的關聯欄位,只需在查詢時得到該欄位的值,Hibernate即可使用該值找到對應的關聯實體。如上例中,note.getAuthor()即可返回當前Note所屬的Author對象。
處理關聯和集合類
通過提前抓取將Author連接獲得,而避免初始化proxy帶來的額外開銷也是可能的。這是通過addJoin()方法進行的,這個方法可以讓你將關聯或集合連接進來。
session.createSQLQuery("select {note.*}, {author.*} from note note, user author where note.author = author.id")
.addEntity("note", Note.class)
.addJoin("author", "note.author");
上面的例子是多對一的關聯查詢,反過來做一對多的關聯查詢也是可以的。如下的例子中,author.notes表示該用戶發表的所有日記(Note),Set集合類型:
session.createSQLQuery("select {author.*},{note.*} from note note, user author where author.id = ? and note.author = author.id")
.addEntity("author", User.class)
.addJoin("note", "author.notes");
注意:join查詢會在每行返回多個實體對象,處理時需要注意。
別名和屬性引用
假若SQL查詢連接了多個表,同一個欄位名可能在多個表中出現多次,這會導致SQL錯誤。不過在我們可以通過使用佔位符來完美地解決這一問題。
其實在上例中已經用到了佔位符:
session.createSQLQuery("select {note.*}, {author.*} from note note, user author where note.author = author.id")
.addEntity("note", Note.class)
.addJoin("author", "note.author");
這個查詢指明SQL查詢語句,其中包含佔位附來讓Hibernate注入欄位別名,查詢並返回的實體。
上面使用的{note.*}和{author.*}標記是作為「所有屬性」的簡寫形式出現的,當然你也可以明確地羅列出欄位名。但如下的範例代碼中我們讓Hibernate來為每個屬性注入SQL欄位別名,欄位別名的佔位符是表別名
+ . + 屬性名。
注意:屬性名區分大小寫,而且不能夠在where子句中使用佔位符。
SQLQuery query = session.createSQLQuery("select note.id as {note.id},note as {note.note},createtime as {note.createTime},author as {note.author}, {author.*} from note, user author where note.id = ? and note.author = author.id");
query.addEntity("note", Note.class);
query.addJoin("author", "note.author");
大多數情況下,上面的別名注入方式可以滿足需要,但在使用更加復雜的映射,比如復合屬性、通過標識符構造繼承樹,以及集合類等等情況下,則需要更加復雜的別名注入方式。
Ⅵ hibernate查詢語句中條件欄位為集合時sql文怎麼寫
條件欄位為集合是指某個條件包含多個值嗎?
如果是的話就 where 條件1 in (值1,值2,值3)來表示,這里有一個情況需要說明,如果是在存儲過程中使用這個會有點問題,如果是sql的reprotbuilder的話值1,值2可以用一個多值參數傳遞進來。
Ⅶ hibernate執行原生sql和客戶端執行sql的區別
sql和客戶端執行sql的區別。
1、sql面向資料庫表查詢:sql:from後面跟的是表名where後用表中欄位做條件。
2、hql面向對象查詢:hql:from後面跟的類名+類對象where後用對象的屬性做條件。
3、在Hibernate中使用查詢時,一般使用燃並Hql查詢語句。HQL(HibernateQueryLanguage),即Hibernate的查詢語言跟脊磨SQL非常相像。HQL與SQL的最根本的區別,就是它是面向櫻段斗對象的。
Ⅷ hibernate執行sql語句問題
HQL執行語句:
update A(對象) set A.a(對象.屬性) = "12" where A(對象.屬性) = "car1"
SQL執行語句:
update A(表名) set a(欄位名) = "12" where car(欄位名) = "car1"
就我知道暫時兩種執行方式