OID查詢
一、什麼是OID查詢
根據對象的OID主鍵進行檢索
二、OID查詢方式
1. get方法
- 當get()方法被調用的時候就會立即發出SQL語句
- 并且傳回的對象也是實際的對象
- 使用get()和普通的單條查詢并沒有多大的差別
- 當查詢不到的時候get()傳回的是null
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.get(User.class, 1L);
System.out.println(user);
transaction.commit();
2. load方法
- 當調用load()方法的時候會傳回一個目标對象的代理對象
- 在這個代理對象中隻存儲了目标對象的ID值
- 隻有當調用除ID值以外的屬性值的時候才會發出SQL查詢的
- 當使用到除ID以外的屬性的時候,會發出SQL查詢語句
- 當查詢不到的時候load()報錯 ObjectNotFoundException
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.load(User.class, 1L);
System.out.println(user.getUser_id());
System.out.println(user.getUser_name());
transaction.commit();
對象導航查詢
Hibernate根據一個已經查詢到的對象,獲得其關聯的對象的一種查詢方式。先查詢到聯系人,就可以通過聯系人擷取聯系人所關聯的客戶對象。
HQL
一、什麼是HQL
HQL查詢:Hibernate Query Language,Hibernate的查詢語言
-
- 是一種面向對象的方式的查詢語言,文法類似SQL。
- 通過session.createQuery(),用于接收一個HQL進行查詢方式。
二、查詢
1. 簡單查詢
- 注意:HQL當中不支援 * 的寫法。是以 select * from 類名 是錯誤的。
- createQuery("from 類名");
@Test
public void test(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
2. 别名查詢
- 注意:HQL當中不支援 * 的寫法。是以 select * from 類名 是錯誤的。
- createQuery("from 類名 别名");
@Test
public void test2(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c from User c");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
3. 排序查詢
- order by 字段 desc/asc
@Test
public void test3(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c from User c order by user_id desc");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
4. 條件查詢
(1)位置綁定
根據參數的位置進行綁定條件(不常用)
@Test
public void test4() {
Session session = HibernateUtil.openSession();
// Query query = session.createQuery("from User where user_code=? and user_name=?");
Query query = session.createQuery("from User where user_code=?0 and user_name=?1");
query.setParameter(0, "user1");
query.setParameter(1, "IT666");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
(2)名稱綁定
把參數對應的值起一個名稱 再去設定名稱
@Test
public void test5() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User where user_code=:a and user_name=:b");
query.setParameter("a", "user1");
query.setParameter("b", "IT666");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
5. 投影查詢
- 查詢對象的某個或某些屬性
(1)單個屬性
@Test
public void test5() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c.user_name from User c");
List<Object> list = query.list();
for (Object o : list) {
System.out.println(o);
}
}
(2)多個屬性
@Test
public void test6() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c.user_code,c.user_name from User c");
List<Object[]> list = query.list();
for (Object[] o : list) {
System.out.println(Arrays.toString(o));
}
}
(3)查詢多個屬性,封裝到對象當中,要在類中,提供構造方法
// 提供有參構造器時,盡量也寫上無參構造器
public User() {}
public User(String user_code, String user_name) {
this.user_code = user_code;
this.user_name = user_name;
}
@Test
public void test7() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select new User(user_code,user_name) from User c");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
6. 分頁查詢
@Test
public void test8() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User");
query.setFirstResult(0); // 角标開始位置
query.setMaxResults(2); // 一次查的條數
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
7. 統計查詢
(1)查詢的結構隻有一個
@Test
public void test9() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select count(*) from User");
Object result = query.uniqueResult();
System.out.println(result);
}
(2)分組查詢
@Test
public void test10() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select user_code,count(*) from User group by user_code");
List<Object[]> list = query.list();
for (Object[] o : list) {
System.out.println(Arrays.toString(o));
}
}
8. 多表查詢
(1)普通内連接配接
@Test
public void test11() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User u inner join u.roles");
List<Object[]> list = query.list();
for (Object[] o : list) {
System.out.println(Arrays.toString(o));
}
}
(2)迫切内連接配接
在普通内連接配接inner join 後添加一個關鍵字fetch,通過hibernate将另一個對象的資料,封裝該對象中
@Test
public void test12() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User u inner join fetch u.roles");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
QBC
一、什麼是QBC
Query By Criteria,條件查詢。是一種更加面向對象化的查詢的方式。
二、查詢
1. 簡單查詢
@Test
public void test() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
2.排序查詢
@Test
public void test2() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 添加排序
criteria.addOrder(Order.desc("user_id"));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
3.分頁查詢
@Test
public void test3() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 添加排序
criteria.addOrder(Order.desc("user_id"));
// 分頁
criteria.setFirstResult(0);
criteria.setMaxResults(2);
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
4.條件查詢
條件
= eq
> gt
>= ge
< lt
<= le
<> ne
like
in
and
or
單個條件
@Test
public void test4() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 添加條件
criteria.add(Restrictions.eq("user_code", "user2"));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
多個條件
@Test
public void test5() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 多條件
criteria.add(Restrictions.eq("user_code", "user2"));
criteria.add(Restrictions.like("user_name", "%888"));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
統計查詢
@Test
public void test6() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 統計查詢 隻有一個結果
criteria.setProjection(Projections.rowCount());
Object result = criteria.uniqueResult();
System.out.println(result);
}
離線條件查詢
- 脫離Session,添加條件
- 可以在外部提前使用DetachedCriteria對象送出設定好條件
- 最後再綁定到session當中
@Test
public void test7() {
DetachedCriteria Criteria = DetachedCriteria.forClass(User.class);
Criteria.add(Restrictions.like("user_name", "%888"));
Session session = HibernateUtil.openSession();
Criteria executableCriteria = Criteria.getExecutableCriteria(session);
List<User> list = executableCriteria.list();
for (User user : list) {
System.out.println(user);
}
}
轉載于:https://www.cnblogs.com/xzh0717/p/10813027.html