如何在 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 【问题描述】:我正在设计一款款待应用。并且在从数据库中获取多行时遇到了一些问题。我正在使用 Hibernate、Spring Web MVC、mysql 和 JSP。我有层作为 Controller、Service、Dao、Model。我设计了一个搜索页面来根据他们的城市查看用户个人资料。例如,当我在搜索屏幕上的城市字段中写入“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 中获取多行?的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring JSP 页面中使用集合时出现 Hibernate LazyInitializationException
Spting +Spring MVC+spring date jsp +hibernate+jq