㈠ Hibernate有幾種查詢方法
Hibernate有4種查詢方法。
HQL 通過Hibernate提供的查詢語言進行查詢。Hibernate Query lanague
EJBQL(JPQL 1.0) 是EJB提供的查詢語言
QBC(query by cretira)通過Cretira介面進行查詢
QBE(query by Example) 通過Example編程介面進行查詢
從功能強弱上排序:NativeSQL > HQL > EJBQL(JPQL 1.0) >QBC(query by cretira) >QBE(query by Example) 1: QBE (Query By Example) QBC查詢方式。
QBC(Query By Criteria)查詢方式是 Hibernate 提供的「 更加面向對象」的一種檢索方式。 QBC 在條件查詢上比 HQL 查詢更為靈活,而且支持運行時動態天生查詢語句。
在Hibernate 應用中使用 QBC 查詢通常經過 3 個步驟:
(1)使用 Session 實例的 createCriteria() 方法創建 Criteria 對象
(2)使用工具類 Restrictions 的相關方法為 Criteria 對象設置查詢對象
(3)使用 Criteria 對象的 list() 方法執行查詢,返回查詢結果QBE查詢QBE查詢就是檢索與指定樣本對象具有相同屬性值的對象。因此QBE 查詢的關鍵就是樣本對象的創建,樣本對象中的所有非空屬性均將作為查詢條件。 QBE 查詢的功能子集,固然 QBE 沒有 QBC 功能大,但是有些場合 QBE 使用起來更為方便。
工具類Example 為 Criteria 對象指定樣本對象作為查詢條件Java代碼:
1 Session session = HibernateSessionFactory.getSessionFactory().openSe ssion();
2 Transaction ts = session.beginTransaction();
3 Customer c = new Customer();
4 c.setCname("Hibernate");
5 Criteria criteria = session.createCriteria(Customer. class );
6 Criteria.add(Example.create(c));
7 Iterator it = criteria.list().iterator();
8 ts.commit();
9 HibernateSessionFactory.closeSession();
㈡ 描述一下hibernate的工作機制,常用的類和方法
通過配置文件,將對象轉型為表
㈢ hibernate的get()方法的使用
session.get( id ),返回是一個object的對象,
你強制裝換一下就好了
session你應該能獲取到吧,
get方法里的參數可以是任何一個 實現了 java.io.序列化介面.
而 不管 是String Ingeter等都實現了此介面,
所以可以傳任何類型的主鍵 對象過來
不知道講的對不對,我也剛學
㈣ Hibernate的幾種查詢方式
HIbernate主要常用有三種查詢方式HQL、QBC、SQL:
1).HQL(Hibernate Query Language):hibernate數據查詢語言;
2).QBC(Query By Criteria):規則查詢
3).SQL:原生的SQL語句(較為復雜的情況下使用)
想要詳細了解的可以看一下下面的幾篇文章:
QBC數據查詢
HQL單表查詢
HQL多表查詢
希望對你有所幫助~
㈤ hibernate中的查詢方式有哪些
hibernate的查詢方式主要有以下幾種,你可以看看,也可以去官方下載文檔來看看,不過是英文版本。,謝謝
hibernate查詢方式
♦ 小結Hibernate...
♦ Hibernate對多...
♦ hibernate查詢...
♦ Hibernate之查...
♦ Hibernate 查...
更多相關推薦...
在HQL中關鍵字不區分大小寫,但是屬性和類名區分大小寫,下面介紹各種類型的Hibernate的HQL查詢。
1、Hibernate HQL查詢:簡單屬性查詢
* 單一屬性查詢,返回結果集屬性列表,元素類型和實體類中相應的屬性類型一致
* 多個屬性查詢,返回的集合元素是對象數組,數組元素的類型和對應的屬性在實體類中的類型一致
數組的長度取決與select中屬性的個數
* 如果認為返回數組不夠對象化,可以採用HQL動態實例化Student對象
2、Hibernate HQL查詢:實體對象查詢
* N + 1問題,在默認情況下,使用query.iterate查詢,有可以能出現N+1問題,所謂的N+1是在查詢的時候發出了N+1條sql語句,1: 首先發出一條查詢對象id列表的sql,N: 根據id列表到緩存中查詢,如果緩存中不存在與之匹配的數據,那麼會根據id發出相應的sql語句
* list和iterate的區別?
* list每次都會發出sql語句,list會向緩存中放入數據,而不利用緩存中的數據
* iterate:在默認情況下iterate利用緩存數據,但如果緩存中不存在數據有可以能出現N+1問題
3、Hibernate HQL查詢:條件查詢
* 可以採用拼字元串的方式傳遞參數
Java代碼:
List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();
* 可以採用 ?來傳遞參數(索引從0開始)
Java代碼:
List students = session.createQuery("select s.id, s.name from Student s where s.name like ?").setParameter(0, "%1%").list(); //可以使用?方式傳遞參數 //參數的索引從0開始 //傳遞的參數值,不用單引號引起來 //注意方法鏈編程
* 可以採用 :參數名 來傳遞參數
Java代碼:
List students = session.createQuery ("select s.id, s.name from Student s where s.name like :myname").setParameter("myname", "%1%").list();
* 如果傳遞多個參數,可以採用setParamterList方法
Java代碼:
List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)").setParameterList("myids", new Object[]{1, 2, 3, 4, 5}).list();
* 在HQL中可以使用資料庫的函數,如:date_format
Java代碼:
List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?").setParameter(0, "2008-02").list();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //查詢2008-01-10到2008-02-15創建的學生
List students =
session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?") .
.setParameter(0, sdf.parse("2008-01-10 00:00:00")) .
setParameter(1, sdf.parse("2008-02-15 23:59:59"))
.list();
4、Hibernate HQL查詢:直接使用sql進行查詢
Java代碼:
List students = session.createSQLQuery("select * from t_student").list();
不會返回對象,而是所有屬性,
5、Hibernate HQL查詢:分頁查詢
* setFirstResult(),從0開始
* setMaxResults,每頁顯示多少條數據
Java代碼:
List students = session.createQuery("from Student") .setFirstResult(1) .setMaxResults(2) .list();
6、Hibernate HQL查詢:對象導航查詢,在HQL中採用 . 進行導航
7、Hibernate HQL查詢:連接查詢
* 內連
Sql代碼:
SELECT s.name, c.name FROM Student s (inner) join s.classes c
* 外連接(左連接/右連接)
Sql代碼:
SELECT s.name, c.name FROM Student s left join s.classes c
8、Hibernate HQL查詢:統計查詢
Java代碼:
List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +"group by c.name order by c.name").list(); for (Iterator iter=students.iterator(); iter.hasNext();) { Object[] obj = (Object[])iter.next(); System.out.println(obj[0] + ", " + obj[1]); }
9、DML風格的操作(盡量少用,因為和緩存不同步)
Java代碼:
session.createQuery
("update Student s set s.name=? where s.id< ?")
.setParameter(0, "李四")
.setParameter(1, 5)
.executeUpdate();
應當盡量少用,因為和緩存不同步,也就是說,假如在執行上面的語句之前,已經把student封裝成一個list曾經拿了出來,再執行上面的語句對 student中的表進行數據更新,然後再list Student表,則此時的list是從緩存中取的數據,而不是從表中找到的數據,也就是 說,list拿到的是update前的數據,所以造成了這種不同步,所以這種風格盡量少用。
從這個方面也可以看得出Hibernate並不適用於聚集性,統計,大量批量的更新,刪除等操作。
㈥ 實現基於hibernate的BaseHibernateDao包含常用的CURD方法
BaseHibernateDao的意思就是用泛型的方法實現一個基本的增刪改查(CURD)方法,這樣一些基本的單表操作直接繼承這個類就可以實現了,例子如下:
publicclassBaseHibernateDAO{
privateSessionsession=null;
privateObjectget(Classclz,Serializableid){
Objectret=null;
Sessionsession=HibernateSessionFactory.getSession();
try{
ret=session.get(clz,id);
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
this.closeSession();
}
returnret;
}
protectedvoidadd(Objectitem){
Transactiontx=null;
Sessionsession=HibernateSessionFactory.getSession();
try{
tx=session.beginTransaction();
session.save(item);
tx.commit();
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
if(tx!=null){
tx.rollback();
}
e.printStackTrace();
}finally{
closeSession();
}
}
publicvoiddelete(Classclz,Serializableid){
Transactiontx=null;
Sessionsession=HibernateSessionFactory.getSession();
try{
tx=session.beginTransaction();
session.delete(this.get(clz,id));
tx.commit();
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
if(tx!=null){
tx.rollback();
}
e.printStackTrace();
}finally{
closeSession();
}
}
publicvoipdate(Objectitem){
Transactiontx=null;
Sessionsession=HibernateSessionFactory.getSession();
try{
tx=session.beginTransaction();
session.update(item);
tx.commit();
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
if(tx!=null){
tx.rollback();
}
e.printStackTrace();
}finally{
closeSession();
}
}
publicListsearch(Classclazz,Objectcondition){
Listresults=null;
try{
Sessionsession=HibernateSessionFactory.getSession();
results=session.createCriteria(clazz).add(Example.create(condition)).list();
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
closeSession();
}
returnresults;
}
protectedvoidcloseSession(){
this.session=null;
HibernateSessionFactory.closeSession();
}
}
㈦ Hibernate中getHibernateTemplate()具體包含哪些方法,都怎麼用
HibernateTemplate()提供非常多的常用方法來完成基本的操作,比如通常的增加、刪除、修改、查詢等操作,Spring 2.0更增加對命名SQL查詢的支持,也增加對分頁的支持。大部分情況下,使用Hibernate的常規用法,就可完成大多數DAO對象的CRUD操作。下面是HibernateTemplate的常用方法簡介:
q void delete(Object entity):刪除指定持久化實例
q deleteAll(Collection entities):刪除集合內全部持久化類實例
q find(String queryString):根據HQL查詢字元串來返回實例集合
q findByNamedQuery(String queryName):根據命名查詢返回實例集合
q get(Class entityClass, Serializable id):根據主鍵載入特定持久化類的實例
q save(Object entity):保存新的實例
q saveOrUpdate(Object entity):根據實例狀態,選擇保存或者更新
q update(Object entity):更新實例的狀態,要求entity是持久狀態
q setMaxResults(int maxResults):設置分頁的大小
getHibernateTemplate已經封裝好了一些基本的方法,可以直接去用,也就是template, 而getSession只是獲取一個數據工廠的session,然後大部分方法都需要自己寫,加hql語句,然後用query方法執行,類似添加刪除更新這樣的可以直接用getHibernateTemplate而大部分帶條件查詢的就需要用getSession寫了。
㈧ hibernate中常用的註解方式,如@repository,及詳解。
@overriide :限定重寫父類方法,該註解只能用於方法。
@deprecated:用於表示某個程序元素(類,方法)已過時。
@SupperessWarnings:抑制編譯器警告。
@Autowired是根據類型進行自動裝配的。在上面的例子中,如果當Spring上下文中存在不止一個UserDao類型
@Qualifier配合@Autowired來解決這些問題。
@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按byName自動注入罷了。@Resource有兩個屬性是比較重要的,分別是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
@PostConstruct(JSR-250)
在方法上加上註解@PostConstruct,這個方法就會在Bean初始化之後被Spring容器執行(註:Bean初始化包括,實例化Bean,並裝配Bean的屬性(依賴注入))。
它的一個典型的應用場景是,當你需要往Bean里注入一個其父類中定義的屬性,而你又無法復寫父類的屬性或屬性的setter方法時.
@PreDestroy(JSR-250)
在方法上加上註解@PreDestroy,這個方法就會在Bean初始化之後被Spring容器執行。由於我們當前還沒有需要用到它的場景,這里不不去演示。其用法同@PostConstruct。.
使用@Scope來定義Bean的作用范圍
在使用XML定義Bean時,我們可能還需要通過bean的scope屬性來定義一個Bean的作用范圍,我們同樣可以通過@Scope註解來完成這項工
這些都應該是spring註解方式 看看是不是你要的 如果是 你就按照spring註解方式去網路上再搜搜 還有很多答案
㈨ Hibernate 有哪幾種查詢數據的方式
有三種方式,不過不是樓上說的那三種。
1.HQL查詢
2.QBC查詢
3.本地SQL查詢
㈩ Hibernate有哪幾種查詢數據的方式
3種
1)session對象的load和get方法,只能按主鍵查詢
2)hql:語法與sql類似,但查詢的是對象,支持所有的sql查詢方式,可以直接返回對象集合,可以完成修改刪除
3)Criteria:只能進行查詢,可以不用寫查詢語句,通過java代碼完成