【问题标题】:How can I fetch multiple rows from db in Hibernate , Spring, JSP?如何在 Hibernate、Spring、JSP 中从 db 中获取多行?
【发布时间】:2014-05-26 16:11:42
【问题描述】:

我正在设计一款款待应用。并且在从数据库中获取多行时遇到了一些问题。我正在使用 HibernateSpring Web MVCmySQLJSP。我有层作为 ControllerServiceDaoModel。我设计了一个搜索页面来根据他们的城市查看用户个人资料。例如,当我在搜索屏幕上的城市字段中写入“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 值?

【问题讨论】:

    标签: java mysql spring hibernate jsp


    【解决方案1】:

    要仅查看 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 用户,则第二个选项比一次又一次地询问 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 值?
      猜你喜欢
      • 1970-01-01
      • 2013-08-21
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 2011-07-24
      • 2016-07-23
      相关资源
      最近更新 更多