一般的话在用hibernate地表做查询的时候 ,都会写出这样的HQL语句 
比如有一个用户表,字段有userName,passWord,nickName,Age等 。如果要在页面上显示出所有用户的用户名和昵称;那么一般我想大部分人会这么写吧
hql ="from User"
然后在jsp页面用EL表达示分别取出用户名称和昵称
${user.userName,user.nickName}
但是这样的查询语句和select * from user是没有区别的吧?但是一般不是不推荐在数据库查询的时候使用select *吗?这样不是对数据库的资源消耗很大吗?
可是如果我想用哪几个字段就查询哪几个的话,像这样
hql= "select userName,nickName from User";
可是在程序里再封闭的话也将会很麻烦,因为这样的话,还得在User类里加一个构造方法
user(userName,nickName){
   this.userName = userName;
  this.nickName = nickName
}
然后再对查询的list集合迭代封闭,
for(Iterator it = list.iterator();it.hasNext()){
     Object[] ob = (Object[])it.next();
     User user = new User(ob[0],ob[1]);
}当然还有一种更简单的方法
hql = "select new User(userName,nickName) from User";
但是同样也得有这个构造方法不过我想问的是,大家一般遇到这种情况都用哪种方法多一点,还有就是哪种方法是最优的?

解决方案 »

  1.   

    我们的项目中一般用第一个 hql ="from User" 然后用EL表达式
      

  2.   

    +1但我一般会在struts返回结果时配置字段过滤,好像是inclusion和exclusion标签,就是包含或者剔除页面上不用的字段
      

  3.   

    不过对于数据库来说还是使用了select * from user了吧
      

  4.   

    纠正一下:是只包含使用到的字段,或者剔除不使用的字段“from User”确实如此
      

  5.   

    可是如果我想用哪几个字段就查询哪几个的话,像这样
    hql= "select userName,nickName from User";
    可是在程序里再封闭的话也将会很麻烦,因为这样的话,还得在User类里加一个构造方法
    user(userName,nickName){
      this.userName = userName;
      this.nickName = nickName
    }
    底层的model里不是有set方法的吗?
    我觉得这个应该类似于spring的设值注入,不用写构造器把...
      

  6.   

    就用第一个吧hql ="from User" 然后用EL表达式数组 + EL 表达式也不错,页面上${user[0}就可以了
      

  7.   

    查询一条语句后确实会使用set自动注入生成User对象,但是,对于User类的所有成员变量,若未在hibernate文件中配置其可为null,则默认是必须为该成员赋值的,而不管这些成员是你想要抑或不想要