Hibernate标准查询|限制性预测的例子

282 阅读2分钟

Hibernate Criteria API

Criteria是用来从数据库中选择特定类型的数据的。让我们来看看这个用例,网站提供了搜索功能,你必须用不同的条件来搜索网站,为了使用hibernate来处理这个问题,我们可以对Criteria对象组成不同的参数,并对数据库进行自定义的sql查询来获取数据。

Hibernate criteria API是Hibernate查询语言或HQL的替代品,可以使用不同的条件生成复杂的查询。在这里,我们不能写很多SQL或hql查询,相反,我们可以添加不同的标准参数,生成可战斗的SQL查询。

标准可以使用会话对象来创建。

使用Hibernate API创建标准对象:-

Hibernate提供org.hibernate.Criteria来创建持久化对象的标准。这个对象是由可用的会话对象创建的。

HomeEquity是java持久性对象,在hibernate配置中被映射到home_equity。

Criteria equityCriteria = sess.createCriteria(HomeEquity.class);
 List homeEquitys = equityCriteria.list();
}

上述命令检索了table_homeequity表中的所有行,并将这些行存储在HomeEquity对象的列表中。

以下是在数据库层面执行的等效的本地SQL查询是

select \* from home\_equity

上面的结果会导致表中的所有行,而如果我们只想限制20条记录,那么我们必须使用 Criteria.setMaxResults (Integer no)配置 number 来限制数据

Criteria equityCriteria = sess.createCriteria(HomeEquity.class);
equityCriteria.setMaxResults(20)
List homeEquitys = equityCriteria.list();
}

在不同数据库中执行的相应 SQL 查询如下:

For MySQL
select \* from home\_equity limit 20
For Oracle
select \* from home\_equity rownum <=20

使用 Criteria Order 按查询对对象进行排序根据按升序排序的贷款额对对象列表进行排序。我们必须使用 Critia.addOrder 方法。我们还可以通过一个参数将条件顺序添加到条件中

Criteria equityCriteria = sess.createCriteria(HomeEquity.class);
equityCriteria.addOrder(Order.asc("loan\_amount"));
List homeEquitys = equityCriteria.list();
}

在数据库中执行的等效查询是:

select \* from home\_equity order by loan\_amount asc

我们有许多方法来检索不同的结果。第一种方法分两步进行唯一对象过滤,一步检索内存中的所有对象,下一步是过滤所需的唯一性

equityCriteria.setResultTransformer(Criteria.DISTINCT\_ROOT\_ENTITY).list();
second approache using criteria projects
equityCriteria.setProjection(Projections.distinct(Projections.property("loan\_type")));
the qual native sql executed at database is
select distinct loan\_type from home\_equity

用于对象比较的 Criteria 限制查询休眠 Criteria API 提供了一个内置方法(ne,eq,isNotNull,gt)来进行比较运算符。

equityCriteria.add( Restrictions.like("name", "A%") );

在数据库中执行的相等的本机 SQL 查询是

select \* from home\_equity where name like 'A%'
equityCriteria.add( Restrictions.lit("loan\_amount", "100000") );

在数据库中执行的相等的本机 SQL 查询为

select \* from home\_equity where loan\_amount <10000
equityCriteria.add(Restrictions.between("loan\_amount", "10000", "50000"));

上述条件的原生 SQL 是

select \* from home\_equity where loan\_amount between 10000 and 50000