[英]How can I fetch multiple rows from db in Hibernate , Spring, JSP?
我正在設計一個款待應用程序。 並且從數據庫中獲取多行時遇到了一些問題。 我正在使用Hibernate , Spring Web MVC , mySQL和JSP 。 我有控制器 , 服務 , Dao , 模型層 。 我設計了一個搜索頁面,以根據用戶所在的城市查看他們的個人資料。 例如,當我在搜索屏幕上的城市字段中寫入“ 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);
}
}
和控制器類:
@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值?
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=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
用戶,則第二個選項比一次又一次地詢問數據庫更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.