簡體   English   中英

如何在Hibernate,Spring,JSP中從db中獲取多行?

[英]How can I fetch multiple rows from db in Hibernate , Spring, JSP?

我正在設計一個款待應用程序。 並且從數據庫中獲取多行時遇到了一些問題。 我正在使用HibernateSpring Web MVCmySQLJSP 我有控制器服務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用戶,您有兩種方法:

  1. 僅獲取isHosting=true用戶
    為此,您的查詢將更改為:

     session.createQuery("select u from User u where u.city = :city and u.isHosting is true") .setString("city", city) .list(); 
  2. 獲取所有具有匹配城市的用戶,然后在您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM