如何在 Hibernate、Spring、JSP 中从 db 中获取多行?

Posted

技术标签:

【中文标题】如何在 Hibernate、Spring、JSP 中从 db 中获取多行?【英文标题】:How can I fetch multiple rows from db in Hibernate , Spring, JSP? 【发布时间】:2014-05-26 16:11:42 【问题描述】:

我正在设计一款款待应用。并且在从数据库中获取多行时遇到了一些问题。我正在使用 HibernateSpring Web MVCmysqlJSP。我有层作为 ControllerServiceDaoModel。我设计了一个搜索页面来根据他们的城市查看用户个人资料。例如,当我在搜索屏幕上的城市字段中写入“NewYork”时,它将显示居住在 NewYork 的用户配置文件列表并将 isHosting 值标记为 true

这是我的 User 类:

public class User


@Column(unique = true, nullable = false)
private String username;
...
private String city;
private String isHosting;

public boolean isHosting() 
    return hosting;



public void setHosting(boolean hosting) 
    this.hosting = hosting;


    ...
 

搜索类:

public class Search 

    private String city;
    private String sdate;
    private String fdate;
    private String numOfvisitor;

 ...


这是我的课:

@Repository
public class SearchDao extends GenericDao<User> 

public User findByUserCity(final String city)

    final Criteria c = createCriteria(User.class).add(Restrictions.eq("city", city));

    return (User) c.uniqueResult();

服务类:

@Service
@Transactional
public class SearchService extends GenericService<User>

@Autowired
public SearchService(SearchDao dao) 
    super(dao);



...

public User findByUserCity(final String city) 
    return ((SearchSurferDao) this.dao).findByUserCity(city);

Controller类:

@RequestMapping(value = "/search", method = RequestMethod.GET)
public ModelAndView search(@ModelAttribute Search search) 


    User user = SearchService.findByUserCity(search.getCity());

    ModelAndView result = new ModelAndView("hello");

    ...

    result.addObject("username", user.getUsername());
    return result;

我知道我需要编写一个返回列表的数据库查询,并且需要将该列表发送到 JSP 文件,并且使用 foreach 标记我可以在屏幕上看到配置文件。但是如何编写数据库查询来从db中获取这样的列表,实际上将它放在哪个类中呢?我需要在 Controller 中做什么?我在哪里可以查看 isHosting 值?

【问题讨论】:

【参考方案1】:

要仅查看 isHosting=true 用户,您有两种方法:

    仅获取 isHosting=true 用户 为此,您的查询将更改为:

    session.createQuery("select u from User u where u.city = :city and u.isHosting is true")
              .setString("city", city)
              .list();
    

    获取所有匹配城市的用户,然后在您的 java 代码中过滤它们。

    ArrayList<User> fetchedList=session.createQuery("select u from User u where u.city = :city")
              .setString("city", city)
              .list();
    for(User u: fetchedList)
     if(u.isHosting())
      display(u);
     
    
    

在这里,我建议使用第一个选项,因为数据库查询通常比在客户端遍历获取的数据要快。

但是,如果您想要了解所有用户的信息并想要过滤 isHosting=true 用户,则第二个选项比一次又一次地询问 DB 更好。

【讨论】:

【参考方案2】:
Criteria c = createCriteria(User.class).add(Restrictions.eq("city", city));
return (User) c.uniqueResult();

上面的代码确实创建了一个查询来查找给定城市的用户。但它假设给定城市中只有一个用户,但情况可能并非如此。方法应该是

public List<User> findByUserCity(final String city) 
    Criteria c = createCriteria(User.class).add(Restrictions.eq("city", city));
    return c.list();

此外,Criteria API 会导致代码难以阅读,适用于必须根据多个搜索条件动态组合查询的情况。对于这样的静态查询,你应该使用 HQL:

public List<User> findByUserCity(String city) 
    return session.createQuery("select u from User u where u.city = :city")
                  .setString("city", city)
                  .list();

【讨论】:

非常感谢。有用!但我仍然想知道我在哪里可以检查 isHosting 值?

以上是关于如何在 Hibernate、Spring、JSP 中从 db 中获取多行?的主要内容,如果未能解决你的问题,请参考以下文章

Jsp标签字典开发_基于Spring+Hibernate

在 Spring JSP 页面中使用集合时出现 Hibernate LazyInitializationException

Spting +Spring MVC+spring date jsp +hibernate+jq

基于jsp+mysql+Spring+hibernate+的SSH在线学习交流论坛平台

Spring MVC 控制器如何绑定到 JSP 页面?

基于jsp+mysql+Spring+hibernate+的SSH在线学习交流论坛平台