Criteria用法
在Java的Hibernate框架中,Criteria API提供了一种用于动态构建查询的方法,它是Query By Criteria(QBC)查询方式的一部分。这种方式允许开发者避开编写HQL(Hibernate Query Language)语句,而是通过API调用来构建查询条件,更加面向对象,减少了代码的繁琐性。以下是关于Criteria API的一些关键知识点: 1. **Criteria实例创建**: - 使用`Session`对象的`createCriteria()`方法创建Criteria实例,例如:`Criteria crt = session.createCriteria(Organization.class);` 2. **添加查询条件**: - `Restrictions`类提供了多种方法来构建条件,如`eq()`、`ne()`、`gt()`等,例如:`crt.add(Restrictions.eq("parent", parentId));`用于查询`parent`字段等于`parentId`的记录。 3. **模糊查询**: - 使用`like()`方法进行模糊匹配,`MatchMode.ANYWHERE`表示在任何位置匹配,例如:`crt.add(Restrictions.like("allFather", SystemForUserContext.getOrganizationRootNodeId(), MatchMode.ANYWHERE));` 4. **创建引用**: - `createAlias()`方法用于创建关联查询,例如:`Criteria crt = session.createCriteria(HistoryExam.class).createAlias("user","userAlias").add(Restrictions.like("userAlias.id", userid));`这将`HistoryExam`类中的`user`属性与`userAlias`别名关联,并根据`userid`进行过滤。 5. **指定连接方式**: - `createAlias()`的第三个参数可以设置连接类型,如`CriteriaSpecification.LEFT_JOIN`,定义了关联的类型,例如:`criteria.createAlias("msSubjectGroup","msSubjectGroupAlias", CriteriaSpecification.LEFT_JOIN);` 6. **SQL限制**: - `sqlRestriction()`方法允许直接插入SQL片段,但请注意,这将使查询依赖于数据库的SQL语法,例如:`Restrictions.sqlRestrictionSql 限定查询,qbc 添加 sql` 7. **QBE(Query By Example)**: - 基于实例对象创建查询,例如:`cri.add(Example.create(s));`这里的`s`是`Student`类的一个实例,所有与其属性匹配的记录都将被检索出来。 8. **结果集限制**: - 可以使用Criteria API对结果集进行限制,例如:`List cats = sess.createCriteria(Cat.class).add(Restrictions.in("name", new String[]{"Frisby", "Misty"})).list();` 9. **本地SQL查询**: - Hibernate也支持直接执行SQL查询,如:`session.createSQLQuery(sql).addEntity(Student.class).list();`这将执行一个SQL查询并将结果映射到`Student`实体类。 Criteria API使得在Hibernate中构建复杂的查询变得更加灵活和直观,避免了HQL的语法学习成本,同时减少了因为SQL注入带来的安全风险。它通过API的方式提供了丰富的查询条件,能够处理大多数数据库查询需求,提高了开发效率。在实际开发中,结合使用Criteria API和其他查询方式(如HQL、QBE等),可以更好地满足项目的需求。