Hibernate完成基础的CRUD操作后,总结一下在hibernate中常用的查询方法
之前写的简单hibernate简单CRUD的地址https://blog.csdn.net/weixin_39789506/article/details/107063092
接上篇,上篇中只是写了hibernate完成最基本的crud操作.
package com.ren.test;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.LogicalExpression;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.SimpleExpression;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.junit.jupiter.api.Test;
import com.ren.domain.User;
import com.ren.util.SessionUtils;
public class UserQueryTest {
// 方式1 ,查询单个对象,使用session的get方法
@Test
void testGet() throws Exception {
Session session = SessionUtils.getSession();
User user = session.get(User.class, 1L);
System.out.println(user);
session.close();
}
// 方式2 , 查询单个对象使用session的find方法
@Test
void testGet2() throws Exception {
Session session = SessionUtils.getSession();
// 参数1表示将结果封装成什么类型的对象,1L表示要查询的对象的id
User user = session.find(User.class, 1L);
System.out.println(user);
session.close();
}
// 方式3, 使用HQL的方式, 这种方式是面向对象的查询语言
// 使用session的createQuery方法
@Test
void testGet3() throws Exception {
Session session = SessionUtils.getSession();
Query<User> query = session.createQuery("FROM User", User.class);
List<User> us = query.list();
for (User user : us) {
System.out.println(user);
}
session.close();
}
// 方式4.
// 带条件的查询, HQL 支持类似占位符(?)形式的条件查询
// 查询年龄在23和29岁之间的用户信息
@SuppressWarnings("deprecation")
@Test
void testGetByConditions() throws Exception {
Session session = SessionUtils.getSession();
Query<User> query = session.createQuery("FROM User WHERE age >?1 and age < ?2", User.class);
query.setParameter(1, 23);
query.setParameter(2, 29);
query.list().forEach(System.out::println);
session.close();
}
// 方式5. 使用本地SQL查询
@SuppressWarnings("deprecation")
@Test
void testLocalSql() throws Exception {
Session session = SessionUtils.getSession();
NativeQuery entity = session.createSQLQuery("SELECT * FROM User").addEntity(User.class);
entity.list().forEach(System.out::println);
session.close();
}
// ORDER By排序操作 , 按照年龄降序排序
@Test
void testOrderBy() throws Exception {
Session session = SessionUtils.getSession();
Query<User> query = session.createQuery("FROM User Order By age Desc",User.class);
query.list().forEach(System.out::println);
session.close();
}
// 方式6,使用标准查询 , Criteria(标准,条件的意思)表示特定持久类的一个查询,Restrictions类用来拼接查询条件
@Test
void testQuery() throws Exception {
Session session = SessionUtils.getSession();
Criteria criteria = session.createCriteria(User.class);
// 创建查询条件,意思是查询 age = 24的用户信息
// SimpleExpression eq = Restrictions.eq("age", 24);
// criteria.add(eq);
// and连接 查询年龄在23岁到30岁之间的用户信息
// SimpleExpression lowAge = Restrictions.gt("age", 23);
// SimpleExpression hiAge = Restrictions.lt("age", 30);
// LogicalExpression andExp = Restrictions.and(lowAge, hiAge);
// criteria.add(andExp); // 添加查询条件
// or 连接, 查询name属性中包含三或者四的用户信息
// SimpleExpression name = Restrictions.like("name", "%三%");
// SimpleExpression name2 = Restrictions.like("name", "%四%");
// LogicalExpression orExpre = Restrictions.or(name, name2);
// criteria.add(orExpre);
// between 查询年龄在23到30岁之间的员工信息
SimpleExpression loAge = Restrictions.gt("age", 23);
SimpleExpression hiAge = Restrictions.lt("age", 30);
LogicalExpression between = Restrictions.and(loAge,hiAge);
criteria.add(between);
List list = criteria.list();
for (Object object : list) {
System.out.println(object);
}
session.close();
}
}