Java 使用springs getHibernateTemplate,如何获取用户列表并限制结果集?

Java 使用springs getHibernateTemplate,如何获取用户列表并限制结果集?,java,hibernate,spring,spring-mvc,Java,Hibernate,Spring,Spring Mvc,我有一个SpringMVC应用程序,如何返回用户列表并限制结果 我的UserDao看起来像: public List<User> getUsers(int limit) { return super.getHibernateTemplate()???? } 公共列表getUsers(整数限制){ 返回super.getHibernateTemplate()???? } 我假设您这样做是为了分页 您可以创建查询并使用setMaxResults和setFirstResult: pu

我有一个SpringMVC应用程序,如何返回用户列表并限制结果

我的UserDao看起来像:

public List<User> getUsers(int limit) {
  return super.getHibernateTemplate()????
}
公共列表getUsers(整数限制){
返回super.getHibernateTemplate()????
}

我假设您这样做是为了分页

您可以创建查询并使用setMaxResults和setFirstResult:

public List<User> getUsers(int limit)
{
    Query q = getHibernateTemplate().getSession().createQuery("from User");
    q.setFirstResult(0); // modify this to adjust paging
    q.setMaxResults(limit);
    return (List<User>) q.list();
}

它还将为您处理异常转换。

检查此处以查看HibernateTemplate的可用方法:

根据您想要查询的方式,有几种不同的find方法返回列表

  • find(stringquerystring)将允许您运行特定的HQL查询并返回结果列表

  • loadAll(类entityClass)将返回映射类的所有实例的列表,您可以自己筛选它们

无论哪种方式,我都会使用文档中的方法来适应HibernateTemplate


如果您只想“从用户中选择*”,请确保已映射用户类并只获取HibernateTemplate.loadAll(User.class)

如果要使用HibernateTemplate,可以执行以下操作:

@SuppressWarnings("unchecked")
public List<User> getUsers(final int limit) {
    return getHibernateTemplate().executeFind(new HibernateCallback<List<User>>() {
        @Override
        public List<User> doInHibernate(Session session) throws HibernateException, SQLException {
            return session.createCriteria(User.class).setMaxResults(limit).list();
        }
    });
}
@SuppressWarnings(“未选中”)
公共列表getUsers(最终整数限制){
返回getHibernateTemplate().executeFind(新的HibernateCallback()){
@凌驾
公共列表doInHibernate(会话会话)抛出HibernateeException、SQLException{
return session.createCriteria(User.class).setMaxResults(limit).list();
}
});
}

@SuppressWarnings(“未选中”)
公共列表getUsers(最终整数限制){
返回getHibernateTemplate().executeFind(新的HibernateCallback()){
@凌驾
公共列表doInHibernate(会话会话)抛出HibernateeException、SQLException{
return session.createQuery(“来自用户u”).setMaxResults(limit).list();
}
});
}

实际上,不建议再使用hibernate模板了。您应该注入SessionFactory并调用。有关如何设置它的详细信息。这就是为什么您更喜欢SessionFactory而不是HibernateTemplate。

我必须释放会话吗?getSession和gethibernatetemplate之间有什么区别?我只想这样做:从用户中选择*;(和开始/限制筛选器)。@Blackman是的,对不起,我忘了在其中包含getHibernateTemplate()。@Blackman回调允许Spring处理异常转换(选中的/特定于非选中的/Spring异常层次结构的数据源)。getHibernateTemplate()上没有.getSession方法。但我确实发现了getSessionFactory().getCurrentSession()。只要确保dao或dao方法上有@Transactional,就可以使用事务会话。这不允许设置限制。Hibernate 3 HQL现在显式不支持LIMIT,它只是在2中意外地起作用。要测试DAO的客户端,您应该使用以下方法模拟DAO:、等。要测试DAO类本身,请注意加载数据并比较结果集,对于DAO的简单测试,您还可以使用一些内存中的DBs:。在这种情况下,您必须为此类测试更改hibernate方言。我建议使用与生产数据库相同的数据库。在这种情况下,您将能够使用特定于供应商的数据库功能。还有一个功能强大的库,支持DAO集成测试的许多功能:
@SuppressWarnings("unchecked")
public List<User> getUsers(final int limit) {
    return getHibernateTemplate().executeFind(new HibernateCallback<List<User>>() {
        @Override
        public List<User> doInHibernate(Session session) throws HibernateException, SQLException {
            return session.createCriteria(User.class).setMaxResults(limit).list();
        }
    });
}
@SuppressWarnings("unchecked")
public List<User> getUsers(final int limit) {
    return getHibernateTemplate().executeFind(new HibernateCallback<List<User>>() {
        @Override
        public List<User> doInHibernate(Session session) throws HibernateException, SQLException {
            return session.createQuery("from User u").setMaxResults(limit).list();
        }
    });
}