我正在使用DetachedCriteria,我只想要查询的第一个结果,所以我想做类似LIMIT 1in 的事情DetachedCriteria。当我搜索谷歌时,我发现setMaxResult了它的标准。
我要怎么进去DetachedCriteria?
我正在使用DetachedCriteria,我只想要查询的第一个结果,所以我想做类似LIMIT 1in 的事情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;
}
}