HQL深入

1.1. 模糊查询

from Book where author like:author
query.setParameter (“author”,”%”+author+”%”);

代码:
public void findByHQL(){
Session session = HibernateUtils.openSession();
String hql = "from BookTypeEntity where typeName like :tn";
Query query = session.createQuery(hql, BookTypeEntity.class);
query.setParameter("tn","%人工%");
List resultList = query.getResultList();
for (BookTypeEntity bookTypeEntity : resultList) {
System.out.println(bookTypeEntity.getTypeName()+"\t"+bookTypeEntity.getTypeDesc());
}
session.close();
}

1.2. 条件查询
from Order where id > ?
session.createQuery(hql, Order.class).setParameter(0, 3);

代码:
public void findByHQL(){
Session session = HibernateUtils.openSession();
// String hql = "from BookTypeEntity where typeName like :tn";
String hql = "from BookTypeEntity where typeId > ?";//条件是POJO中的属性名称,不是字段名称
Query query = session.createQuery(hql, BookTypeEntity.class);
// query.setParameter("tn","%人工%");
query.setParameter(0,29L);
List resultList = query.getResultList();
for (BookTypeEntity bookTypeEntity : resultList) {
System.out.println(bookTypeEntity.getTypeName()+"\t"+bookTypeEntity.getTypeDesc());
}
session.close();
}

1.3. HQL更新
update Order set createTime = ? where id = ?
query.executeUpdate();

代码:
public void testUpdateHql(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
String hql = "update BookTypeEntity set typeDesc=? where typeId=?";
Query query = session.createQuery(hql);
query.setParameter(0,"提升自己");
query.setParameter(1,30L);
query.executeUpdate();

transaction.commit();
session.close();
}

1.4. HQL删除
delete from Order where id in (:idList) //括号可加可不加
session.createQuery(hql).setParameter("idList", list);

代码:
public void testUpdateHql(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
// String hql = "update BookTypeEntity set typeDesc=? where typeId=?";
String hql = "delete from BookTypeEntity where typeId=?";
Query query = session.createQuery(hql);
// query.setParameter(0,"提升自己");
// query.setParameter(1,30L);
query.setParameter(0,29L);
query.executeUpdate();

  transaction.commit();
  session.close();

}

1.5. 获取某列的值
select orderId from Order
session.createQuery(hql, String.class);
代码:
public void find1(){
Session session = HibernateUtils.openSession();
//如果是一个字段,可以指定这个字段的类型
Query query = session.createQuery("select typeName from BookTypeEntity", String.class);
List resultList = query.getResultList();
for (String s : resultList) {
System.out.println(s);
}
session.close();
}

重点:

1.6. 获取部分字段的值:投影查询(查询局部字段)
select c.name, c.phoneNum, o.orderId, o.createTime from Order o join o.customer c
Query query = session.createQuery(hql, Object[].class);
方式二(不用泛型):Object[] obj = (Object[])list.get(i)

传统希望方式:


HQL深入_第1张图片
image.png

bug:


HQL深入_第2张图片
image.png

调试观察可以用什么解决方案?

HQL深入_第3张图片
image.png

代码:

public void find2(){
Session session = HibernateUtils.openSession();
//如果查询部分字段
Query query = session.createQuery("select typeName,typeDesc from BookTypeEntity", Object[].class);
List resultList = query.getResultList();
for (Object[] objects : resultList) {
System.out.println(objects[0]+"\t"+objects[1]);
}
session.close();
}
注意上面的泛型

调试:
查询返回的不是对象,而是数组


HQL深入_第4张图片
image.png

总结:查询部分字段,返回的是Object[]数组。

1.7. 函数查询
select max(id), count(*) from Order
session.createQuery(hql, Object[].class);
Object[] obj = query.getSingleResult();

代码:
public void findCount(){
Session session = HibernateUtils.openSession();
Query query = session.createQuery("select count(*) from BookTypeEntity", Long.class);
Long aLong = query.uniqueResult();
System.out.println(aLong);
session.close();
}

1.8. 联合查询得到关联对象

多表查询:连接查询
左连接查询:左边的数据全部显示
//迫切外链接,返回一个对象(包含关联表对象)
from BookInfo b left join fetch b.bookType//别名.关联对象属性
//普通外连接得到是数组对象object[] ,解析结果比较麻烦
右连接查询:右边的数据全部显示
from BookInfo b right join fetch b.bookType
内连接查询:只会显示满足条件的数据
from BookInfo b inner join fetch b.bookType
(等值连接:只返回两个表中联结字段相等的行)
传统查询的方案:


HQL深入_第5张图片
image.png

bug:


HQL深入_第6张图片
image.png

分析问题:
HQL深入_第7张图片
image.png

解决方案一:使用数组作为泛型

HQL深入_第8张图片
image.png

解决方案二:
HQL中使用fetch,可以使用具体的对象作为泛型

public void find5(){
Session session = HibernateUtils.openSession();
//迫切外链接
String hql = "from BookInfoEntity book left join fetch book.bookTypeByTypeId ";
Query query = session.createQuery(hql, BookInfoEntity.class);
List resultList = query.getResultList();
for (BookInfoEntity bookInfoEntity : resultList) {
//主表
System.out.println(bookInfoEntity.getBookName());
//关联表
BookTypeEntity bookTypeByTypeId = bookInfoEntity.getBookTypeByTypeId();
System.out.println("关联分类:"+bookTypeByTypeId.getTypeName());
}

session.close();
}

调试:


HQL深入_第9张图片
image.png

1.9. 排序 一般排序都是和分页一起用的新加入的数据在最上面显示出来
from Order order by id desc

倒序:


HQL深入_第10张图片
image.png

同时可以和分页配合:
//设置分页
query.setFirstResult(0);
query.setMaxResults(5);

本地SQL(扩展了解) 允许在java代码中使用最基本的sql语句操作

image.png

NativeQuery sqlQuery = session.createNativeQuery("select * from t_order", Order.class);
List list = sqlQuery.list();

代码:

public void findSql(){
Session session = HibernateUtils.openSession();
String sql = "select * from book_type";
NativeQuery nativeQuery = session.createNativeQuery(sql, BookTypeEntity.class);
List list = nativeQuery.list();
for (BookTypeEntity bookTypeEntity : list) {
System.out.println(bookTypeEntity.getTypeName()+"\t"+bookTypeEntity.getTypeDesc());
}
session.close();
}

你可能感兴趣的:(HQL深入)