如何从Hibernate,Spring,JSP中的db中获取多行?

时间:2014-04-12 12:53:13

标签: java mysql spring hibernate jsp

我正在设计一个酒店应用程序。从数据库中获取多行时遇到一些问题。我正在使用 Hibernate Spring Web MVC mySQL JSP 。我有 Controller Service Dao Model 的图层。我设计了一个搜索页面,根据他们的城市查看用户个人资料。例如,当我写“NewYork'在搜索屏幕上的城市字段中,它将显示居住在纽约的用户个人资料列表,并将 isHosting 值标记为 true

这是我的用户类:

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;

 ...

}

这是我的 Dao 课程:

@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 值?

2 个答案:

答案 0 :(得分:4)

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();
}

答案 1 :(得分:0)

仅查看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);
     }
    }
    
  3. 在这里,我建议使用第一个选项,因为数据库查询通常比在客户端迭代获取的数据更快。

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