我正在使用DetachedCriteria
,我只想要查询的第一个结果,所以我想做类似LIMIT 1
in 的事情DetachedCriteria
。当我搜索谷歌时,我发现setMaxResult
了它的标准。
我要怎么进去DetachedCriteria
?
我正在使用DetachedCriteria
,我只想要查询的第一个结果,所以我想做类似LIMIT 1
in 的事情DetachedCriteria
。当我搜索谷歌时,我发现setMaxResult
了它的标准。
我要怎么进去DetachedCriteria
?
我也只是在研究这个。我不喜欢必须使用标准的解决方案,因为 DetachedCriteria 的整个目的是在您还没有 Session 时定义它。在我处理的应用程序中,这也不是一个选项,因为创建 DetachedCriteria 的位置与实际执行的位置相去甚远。
无论如何,我发现这个巧妙的技巧能够在创建 DetachedCriteria 时定义限制。DetachedCriteria 采用 Criterion 实例,但 Criterion 使用实际的 Criteria(和 CriteriaQuery)回调,因此您可以在那时设置 maxResults。
唯一的问题是 Hibernate 已经在构造 sql 字符串并且已经在查询字符串中添加了一个“和”,因为它需要一个比较语句。但是我们可以通过返回 '1 = 1' 来伪造它。
请参阅下面的 LimitBy 标准的实现。
public class Limit {
private Limit() {}
public static LimitBy by(int maxResults) {
return new LimitBy(maxResults);
}
static class LimitBy implements Criterion {
private int max;
public LimitBy(int max) {
this.max = max;
}
@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
criteria.setMaxResults(max);
return "1 = 1";
}
@Override
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
return new TypedValue[0];
}
}
}
所以有了这个 LimitBy 类,现在可以限制 DetachedCriteria 使用
DetachedCriteria.forClass(..)
.add(Limit.by(1));
现在,这只返回查询的第一个结果。
这适用于 Postgres,并且未在其他数据库上进行测试,但我希望它也适用于其他数据库。当某些数据库不起作用时的响应。
您可以使用 CRITERIA API
detachedcrit.getExecutableCriteria(session).SetMaxResults(1)
@Joost den Boer 发布的解决方案对我不起作用,但我找到了使用类似方法的解决方法:
public class PageRestrictions {
public static class Page implements Criterion {
private Integer limit;
private Integer offset;
private Order order;
public Page offset(Integer offset) {
this.offset = offset;
return this;
}
public Page limit(Integer limit) {
this.limit = limit;
return this;
}
public Page by(Order order) {
this.order = order;
return this;
}
@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
StringBuilder builder = new StringBuilder("1=1");
if (this.order != null) {
builder.append(" order by ").append(this.order.toSqlString(criteria, criteriaQuery));
}
if (this.offset != null) {
builder.append(" offset ").append(this.offset);
}
if (this.limit != null) {
builder.append(" limit ").append(this.limit);
}
return builder.toString();
}
@Override
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
return new TypedValue[0];
}
}
public static Page offset(Integer offset) {
Page page = new Page();
page.offset(offset);
return page;
}
public static Page limit(Integer limit) {
Page page = new Page();
page.limit(limit);
return page;
}
public static Page by(Order order) {
Page page = new Page();
page.by(order);
return page;
}
}