Hibernate条件查询

本文介绍了Hibernate的Criteria查询API,这是一种面向对象的查询方式,能够避免直接编写SQL,简化复杂条件查询。虽然在Hibernate5.2中不再推荐,但仍然阐述了其基本用法,包括全表查询、条件查询、多结果查询等场景,并给出了实例代码。

一、简介

Hibernate查询可以使用HQL  NativeQuery,都要求对底层SQL语言数量掌握。对于比较复杂的SQL条件查询,如果程序员对SQL掌握不好,写起来会有一定困难。

Criteria 是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现、SQL语句如何编写,是HQL Native Query的替代。

Criteria 查询采用面向对象方式封装查询条件,对SQL 语句进行封装,采用对象的方式来组合各种查询条件,由Hibernate 自动产生SQL 查询语句,是Hibernate框架的核心查询对象。

 使用入门

Hibernate5.2中已不推荐使用Criteria,而是使用基于JPA规范的CriteriaQuery查询,更适于扩展。

普通全表查询

// 组织Criteria的各个不同部分,是一个工厂类

CriteriaBuilder bd = session.getCriteriaBuilder();

//条件查询结果准备

CriteriaQuery<User> cq = bd.createQuery(User.class);

//查询的表:相当from

Root<User> root = cq.from(User.class);

//相当被查询字段

cq.select(root);//执行查询

List<User> list = session.createQuery(cq).getResultList();

2  条件查询

//准备条件查询结果

CriteriaQuery<String> cq = bd.createQuery(String.class);

//查询的表:相当from

Root<User> root = cq.from(User.class);

//相当被查询字段

cq.select(root.get("pass"));

//相当查询条件

cq.where(bd.equal(root.get("id"), 3));

//执行查询

String pass = session.createQuery(cq).getSingleResult();

多结果查询:封装成数组

//准备条件查询结果

CriteriaQuery<Object[]> cq = bd.createQuery(Object[].class);

//查询的表:相当from

Root<User> root = cq.from(User.class);

//相当被查询多个字段

cq.multiselect(root.get("name"),root.get("pass"));

//相当查询条件

cq.where(bd.equal(root.get("id"), 3));

//执行查询

Object[] rs = session.createQuery(cq).getSingleResult();

多结果查询,使用Tuple工具类

//准备条件查询结果:Tuple是工具类,封装查询结果

CriteriaQuery<Tuple> cq = bd.createTupleQuery();

//查询的表:相当from

Root<User> root = cq.from(User.class);

//相当被查询多个字段

Path<Object> path = root.get("name");

cq.multiselect(path,root.get("pass"));

//相当查询条件

cq.where(bd.equal(root.get("id"), 3));

//执行查询

Tuple tuple = session.createQuery(cq).getSingleResult();

System.out.println(tuple.get(path));

System.out.println(tuple.get(1));

### 使用Hibernate Session 进行条件查询Hibernate中,`Session` 接口提供了多种方式进行条件查询。以下是几种常见的实现方法: #### 1. HQL 查询 HQL(Hibernate Query Language)是一种面向对象的查询语言,类似于SQL但更强大。 ```java // 创建会话并开启事务 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); // 编写HQL查询语句 String hql = "FROM Employee E WHERE E.salary > :salary"; Query query = session.createQuery(hql); query.setParameter("salary", 5000); List results = query.list(); tx.commit(); session.close(); ``` 此代码片段展示了如何利用参数化查询防止SQL注入攻击[^1]。 #### 2. Criteria API Criteria API 提供了一种类型安全的方式来构建动态查询。 ```java Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class); Root<Employee> root = criteria.from(Employee.class); criteria.select(root).where(builder.greaterThan(root.get("salary"), 5000)); List<Employee> employees = session.createQuery(criteria).getResultList(); tx.commit(); session.close(); ``` 这段代码使用了JPA标准的一部分——Criteria API来创建灵活且易于维护的查询逻辑[^3]。 #### 3. 命名查询 对于经常使用的复杂查询,可以将其定义为命名查询以便重用。 ```xml <!-- 在实体类对应的.hbm.xml文件中 --> <hibernate-mapping> <class name="com.example.Employee"> ... <sql-query name="findHighPaidEmployees"> <![CDATA[ FROM Employee e WHERE e.salary > ? ]]> </sql-query> </class> </hibernate-mapping> // 或者使用注解形式 @NamedQuery( name = "findHighPaidEmployees", query = "FROM Employee e WHERE e.salary > :minSalary" ) // 调用命名查询 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); Query namedQuery = session.getNamedQuery("findHighPaidEmployees"); namedQuery.setParameter("minSalary", 5000); List result = namedQuery.list(); tx.commit(); session.close(); ``` 上述例子说明了两种不同的方式来配置和调用命名查询[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值