猿问

如何限制休眠条件 API 获得的结果?

假设我们有一个 Person 类,它是一个简单的休眠实体。我们有一个 DAO,它有一个方法可以检索名称列表中列出的所有 Person 行:


@Transactional

public List<Person> getPersons(List<String> personNames) {


ArrayList<Criterion> locationCriterions = new ArrayList<Criterion>();


if(personNames == null) {

       return new ArrayList<Person>();

}


Criterion [] arrayOfPersonCriterions = new Criterion 

[personNames.size()];


   int currentIndex = 0;


   for(String currentPersonName : personNames) {   

   arrayOfPersonCriterions[currentIndex](Restrictions.eq("name", 

   currentPersonName));

   currentIndex++;

   }     


   Criterion personFinalCriterion = Restrictions.or(arrayOfPersonCriterions);

   Session currentSession = sessionFactory.getCurrentSession();

   Criteria criteria = currentSession.createCriteria(Person.class);


   return (List<Person>)criteria.add(personFinalCriterion).list();


问题:如何限制检索结果的数量——就像在 SQL 中我们可以使用 LIMIT X, Y 查询文本一样?


请注意:


我想使用 Criteria API 并避免本机查询 - 我可以使用本机查询但一般不想摆脱 Criteria,


避免处理返回的列表,以便它只返回我认为无意义且效率低下的结果范围。


绝地无双
浏览 103回答 2
2回答

BIG阳

您可以设置使用setFirstResult跳过记录并setMaxResults从该点获取记录数。Criteria criteria = session.createCriteria(Foo.class);criteria.setFirstResult(0);criteria.setMaxResults(pageSize);List<Foo> firstPage = criteria.list();

哆啦的时光机

您可以使用以下两种方法Criteriacriteria.setFirstResult(indexOfTheFirstRecord)指定第一条记录(从0开始) criteria.setMaxResults(numberOfTheRecords)指定记录数为了简单起见,您可以使用此类public class Pagination {&nbsp; &nbsp; public static final Pagination EMPTY = new Pagination(0, 0);&nbsp; &nbsp; /** Page index, begins from 0. */&nbsp; &nbsp; private final int pageIndex;&nbsp; &nbsp; /** Objects on page count. */&nbsp; &nbsp; private final int pageSize;&nbsp; &nbsp; public Pagination(int pageIndex, int pageSize) {&nbsp; &nbsp; &nbsp; &nbsp; this.pageIndex = pageIndex;&nbsp; &nbsp; &nbsp; &nbsp; this.pageSize = pageSize;&nbsp; &nbsp; }&nbsp; &nbsp; public void addToCriteria(Criteria criteria) {&nbsp; &nbsp; &nbsp; &nbsp; if (this == EMPTY) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; criteria.setMaxResults(pageSize);&nbsp; &nbsp; &nbsp; &nbsp; criteria.setFirstResult(pageIndex * pageSize);&nbsp; &nbsp; }}例子获取pageIndex = 1大小为 10 的第二页 ( )(带有startIndex = 10,的记录endIndex = 19)final int pageIndex = 1;Pagination pagination = new Pagination(pageIndex, 10);pagination.addToCriteria(criteria);
随时随地看视频慕课网APP

相关分类

Java
我要回答