我正在设计一个酒店应用程序。从数据库中获取多行时出现问题。我正在使用Hibernate、Spring Web MVC、mySQL和JSP。我有控制器、服务、Dao、模型等层。我设计了一个搜索页面,可以根据所在城市查看用户配置文件。例如,当我在搜索屏幕上的city字段中写入“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;

 ...

}

这是我的道课:
@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标记,我可以在屏幕上看到配置文件。但是,如何编写一个数据库查询来从数据库中获取这样一个列表,实际上将它放在哪个类中呢?我需要在控制器中做什么?在哪里可以检查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();
}

09-10 09:46
查看更多