hibernate 的查询方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ilikejj0/article/details/82052243

查询方式
1、对象导航查询:
根据id查询用户,然后根据用户再查角色,可以使用对象导航查询

//根据客户的id查询用户,然后查询所有的角色
User user = session.get(User.class, 2);
//不用使用session的方法就可以得到
Set<Role> roleSet = user.getRoleSet();
for (Role role : roleSet) {
    System.out.println(role);
}

Role [roleId=2, roleName=蛇岐大家长]
Role [roleId=4, roleName=皇]

2、OID查询:根据id记录,返回对象

3、hql查询:Query对象,根据hql语句实现查询
hql:查询所有

Query query = session.createQuery("from User");
List<User> list = query.list();
for (User user : list) {
    System.out.println(user);
}

User [uId=1, userName=路明非, password=123456]
User [uId=2, userName=源稚生, password=123456]

hql:条件查询,是实体类中的名字

//创建Query对象,其中不能使用原始方式写为uId=?,而是改成JPA占位符的方式:
//其中"?"后面的"0"代表索引位置,在HQL语句中可重复出现,
//并不一定要从0开始,可以是任何数字,只是参数要与其对应上。
Query query = session.createQuery("from User where uId=?0");
//设置参数,方法中第一个参数是参数的位置,第二个参数是参数的值,参数的位置是从0开始。
query.setParameter(0, 1);
List<User> list = query.list();
for (User user : list) {
    System.out.println(user);
}

User [uId=1, userName=路明非, password=123456]

hql条件查询:

Query query = session.createQuery("from User where userName like ?0");
query.setParameter(0, "%源稚%");
List<User> list = query.list();
for (User user : list) {
    System.out.println(user);
}

User [uId=2, userName=源稚生, password=123456]
User [uId=3, userName=源稚女, password=123456]

hql排序查询

Query query = session.createQuery("from User order by uId desc");
List<User> list = query.list();
for (User user : list) {
    System.out.println(user);
}
User [uId=3, userName=源稚女, password=123456]
User [uId=2, userName=源稚生, password=123456]
User [uId=1, userName=路明非, password=123456]

hql分页查询

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);
}

User [uId=1, userName=路明非, password=123456]
User [uId=2, userName=源稚生, password=123456]

hql投影查询:查询不是所有的字段,而是某些字段

//这个时候不能够使用*
Query query = session.createQuery("select roleName from Role");
//这里list的类型不能写对象,而是一个Object,这里也可以写String
List<Object> list = query.list();
for (Object object : list) {
    System.out.println(object);
}

卡塞尔学生
蛇岐大家长
衰仔
皇

hql聚集函数

Query query = session.createQuery("select count(*) from Role");
Object object = query.uniqueResult();
//这里如果要进行类型转换,一定是先转成long,然后再转成int
System.out.println(object);

结果是4

4、QBC查询:criteria对象

5、本地sql查询:sqlQuery查询,使用普通sql查询

扫描二维码关注公众号,回复: 3151451 查看本文章

Hibernate检索策略
(1)、立即检索:根据id查询,调用get方法,一调用get方法,立刻发送查询语句

User user = session.get(User.class, 1);

(2)、延迟检索:根据id查询,使用load方法,调用load方法不会立刻发送查询语句,只有需要对象里的值的时候才会发送查询语句

User user = session.load(User.class, 1);
//这句也不会发送sql语句进行查询
System.out.println(user.getuId());
//当开始执行到下面这句时才会发送sql语句进行查询
System.out.println(user.getUserName());

延迟查询分为两类:
类级别延迟:根据id返回实体类对象,调用get方法不会立刻发送查询语句。
关联级别延迟:查询某个用户,再根据用户查出他的角色。(对象导航查询)查询出客户所需要的联系人是否需要延迟,成为关联级别延迟。默认是有延迟的。

批量抓取:查询所有客户,返回list集合,遍历list集合,得到每个客户,然后再根据客户,得到每个客户的所有联系人。不使用批量抓取效率会很低。
这个时候就可以使用批量抓取,在用户映射文件中的set标签内,使用batch-size属性,值越大,优化越好。

猜你喜欢

转载自blog.csdn.net/ilikejj0/article/details/82052243