Hibernate查詢語句
阿新 • • 發佈:2021-01-02
1 hql查詢
Hibernate的查詢語句,hiberante提供的面向物件的查詢語言,和sql語句的語法的相似.而且嚴格區分大小寫。
1.1 from字句
/** * hql: from 字句 * ***/ @Test public void testFromHql() { //獲得Session物件 Session session=sf.openSession(); String hql="from Dept"; //獲得部門物件的集合 List<Dept> dlist = session.createQuery(hql).list(); for(Dept d:dlist){ System.out.println(d.getDname()); } //釋放資源 session.close(); }
語法:from 類名
1 from 類名
返回值就是該類對應的物件的集合
2 關聯查詢
From 類名1,…類名N 返回值為Object類的陣列的集合
Object型別陣列中元素為:類名1 ….類名N對應的物件
1.2 select字句
select:後指定一個屬性
Select:後指定兩個屬性
/** * hql: select 字句 * select查詢獲得不是某個pojo類的物件集合 * ***/ @Test public void testSelectHql() { //獲得Session物件 Session session=sf.openSession(); //select:後面指定一個屬性 /*String hql="select dname from Dept"; //獲得指定屬性型別對應的集合 List<String> dlist = session.createQuery(hql).list(); for(String d:dlist){ System.out.println(d); }*/ //select:後面指定多個屬性 String hql="select did,dname from Dept"; //獲得Object型別陣列的集合 List<Object[]> dlist = session.createQuery(hql).list(); for(Object[] d:dlist) { System.out.println(d[0]+"\t"+d[1]); } //釋放資源 session.close(); }
Select返回值三種情況
1 select 指定一個屬性
返回值為屬性對應的型別的集合
2 select指定n個屬性
返回值為Object[]陣列的集合,陣列中元素為指定屬性對應的值
3 select獲得結果為單行單列
直接返回Object型別的物件,uniqueResult()
1.3關聯查詢
/*** * 關聯查詢 * ***/ @Test public void testJoinHql() { //獲得Session物件 Session session=sf.openSession(); /*String hql="from Dept d,Post p where d.did=p.dept.did"; //獲得Object型別的陣列集合,陣列中元素是關聯的pojo類物件 List<Object[]> dlist = session.createQuery(hql).list(); for(Object[] d:dlist){ //System.out.println(d[0]+"\t"+d[1]); Dept dept=(Dept)d[0]; Post post=(Post)d[1]; System.out.println(dept.getDname()+"\t"+post.getPname()); }*/ String hql="select d.dname,p.pname from Dept d,Post p where d.did=p.dept.did"; //獲得Object型別的陣列集合,陣列中元素是select後面指定的屬性 List<Object[]> dlist = session.createQuery(hql).list(); for(Object[] d:dlist) { System.out.println(d[0]+"\t"+d[1]); } //釋放資源 session.close(); }
1.4連線查詢
/***
* 內連線:inner join
* ***/
@Test
public void testInnerJoinHql()
{
//獲得Session物件
Session session=sf.openSession();
String hql="from Dept d inner join d.posts ";
List<Object[]> list = session.createQuery(hql).list();
//遍歷結果集
for(Object[] arr:list)
{
System.out.println(arr[0]+"\t"+arr[1]);
}
//釋放資源
session.close();
}
/***
* 做外連線:left join
* ***/
@Test
public void testLeftJoinHql()
{
//獲得Session物件
Session session=sf.openSession();
String hql="from Dept d left join d.posts p ";
List<Object[]> list = session.createQuery(hql).list();
//遍歷結果集
for(Object[] arr:list)
{
System.out.println(arr[0]+"\t"+arr[1]);
}
//釋放資源
session.close();
}
不需要指定關聯的條件,
hibernate根據對映檔案自動關聯
1.5聚合和分組查詢
/***
* 聚合和分組查詢
* max
* min
* avg
* sum
* ***/
@Test
public void testFunGroup()
{
//獲得Session物件
Session session=sf.openSession();
/***獲得每個部門下的崗位人數***/
String hql="select p.dept.dname ,count(pid) from Post p group by p.dept.did ";
List<Object[]> list = session.createQuery(hql).list();
//遍歷結果集
for(Object[] arr:list)
{
System.out.println(arr[0]+"\t"+arr[1]);
}
//釋放資源
session.close();
}
1.6 where 字句
和屬性的表示式寫法一樣
And or not
< >= <=
In , not in
Like,not like
Between and
1.7 order by字句
2 條件查詢
標準的面向物件的查詢,
public class TestMany2One
{
/**
* 通過靜態程式碼塊載入配置檔案
* ****/
static SessionFactory sf=null;
static
{
//1 建立Configuration物件,用來載入hibernate的配置檔案
Configuration cfg = new Configuration();
//2載入配置檔案
cfg.configure("hibernate.cfg.xml");
//3通過cfg構造一個會話工廠物件
sf=cfg.buildSessionFactory();
}
/**
* criteria:查詢所有(所有列,所有行)
* ***/
@Test
public void testCriteria()
{
//獲得Session物件
Session session=sf.openSession();
List<Dept> list=session.createCriteria(Dept.class, "d").list();
for(Dept d:list){
System.out.println(d.getDname());
}
//釋放資源
session.close();
}
/**
* criteria:查詢所有(所有列,所有行)
* 進行結果的過濾
* ***/
@Test
public void testCriteria2()
{
//獲得Session物件
Session session=sf.openSession();
Criteria c = session.createCriteria(Dept.class, "d");
//加where過濾條件
//c.add(Restrictions.eq("d.did", 11));
//c.add(Restrictions.like("d.dname", "安慰%"));
//c.add(Restrictions.)
List<Dept> list = c.list();
for(Dept d:list)
{
System.out.println(d.getDname());
}
//釋放資源
session.close();
}
/**
* criteria:查詢所有(所有列,所有行)
* 進行結果的過濾
* 查詢指定的列:進行投影查詢Projections
* ***/
@Test
public void testCriteria3()
{
//獲得Session物件
Session session=sf.openSession();
Criteria c = session.createCriteria(Dept.class, "d");
//查詢指定的列
c.setProjection(Projections.projectionList().add(Projections.property("dname"))
.add(Projections.property("did")));
List<Object[]> list = c.list();
for(Object[] d:list)
{
System.out.println(d[0]+"\t"+d[1]);
}
//釋放資源
session.close();
}
/**
* criteria:查詢所有(所有列,所有行)
* 進行結果的過濾
* 查詢指定的列:進行投影查詢Projections
* 投影,聚合 ,分組
*
* ***/
@Test
public void testCriteria4()
{
//獲得Session物件
Session session=sf.openSession();
Criteria c = session.createCriteria(Dept.class, "d");
//查詢指定的列
c.setProjection(Projections.projectionList().add(Projections.property("d.dname"))
.add(Projections.property("d.did"))
.add(Projections.count("d.did"))
.add(Projections.groupProperty("d.dname")));
List<Object[]> list = c.list();
for(Object[] d:list)
{
System.out.println(d[0]+"\t"+d[1]+"\t"+d[2]);
}
//釋放資源
session.close();
}
/***
* 關聯查詢
*
* ****/
@Test
public void testCriteria5()
{
//獲得Session物件
Session session=sf.openSession();
Criteria c = session.createCriteria(Dept.class, "d");
//關聯崗位
c.createAlias("d.posts", "p");
//查詢指定的列
//c.add(Restrictions.eqProperty("d.did", "p.dept.did"));
List<Dept> list = c.list();
for(Dept d:list)
{
System.out.print(d.getDname()+"\t");
Set<Post> posts=d.getPosts();
for(Post p:posts)
{
System.out.print(p.getPname()+"\t\t");
}
System.out.println();
}
//釋放資源
session.close();
}
}
3 Hql語句的引數封裝
/**
* Hql:的引數
* ***/
@Test
public void testHqlParam()
{
//獲得Session物件
Session session=sf.openSession();
//定義hql語句,hql語句中包含佔位符
String hql="from Dept d where d.dname=? ";
session.createQuery(hql).setString(0, "研發部");
//常用的
String hql2="from Dept d where d.dname=:dname";
List<Dept> list=session.createQuery(hql2).setString("dname", "研發部").list();
for(Dept d:list)
{
System.out.println(d.getDid()+"\t"+d.getDname());
}
//釋放資源
session.close();
}
1 from 類名
返回值就是該類對應的物件的集合
2 關聯查詢
From 類名1,…類名N
返回值為Object類的陣列的集合
Object型別陣列中元素為:類名1
….類名N對應的物件
Select返回值三種情況
1 select 指定一個屬性
返回值為屬性對應的型別的集合
2 select指定n個屬性
返回值為Object[]陣列的集合,陣列中元素為指定屬性對應的值
3 select獲得結果為單行單列
直接返回Object型別的物件,uniqueResult()
不需要指定關聯的條件,
hibernate根據對映檔案自動關聯