public interface UserinfoDAO {
   public Long execureHQL(String hql);
}
public class UserinfoDAOImpl extends BaseHibernateDAO implements UserinfoDAO {
public Long execureHQL(String hql) {
Long returnLong;
try {
returnLong = (Long) getSession().createQuery(hql).uniqueResult();
} catch (RuntimeException re) {
log.error("UserinfoDAOImpl execureHQL failed", re);
throw re;
}
return returnLong;
}
}public interface UserinfoServices {
public Long longLogin(String uid, String pw);
        public Long updatePassword(String uid, String pw);
}
public class UserinfoServicesImpl implements UserinfoServices {
  public Long longLogin(String uid, String pw) {
UserinfoDAO userDao = new UserinfoDAOImpl();
StringBuffer sb = new StringBuffer();
Long longHQL = null;
sb.append("select count(*) from Userinfo uinfo where uinfo.userid = ");
sb.append(uid);
sb.append(" and uinfo.userpw = dbo.md5(");
sb.append(pw);
sb.append(")");
try {
longHQL = userDao.execureHQL(sb.toString());
} catch (Exception e) {
log.error("UserinfoServicesImpl longLogin failed", e);
}
return longHQL;
}
    
    //省略
    updatePassword}
UserinfoServicesImpl中的longLogin 看起来很不爽
因为用的是拼装sql语句,hql中的setParameter()方法都用不到
感觉这里问题很大,请问如何修改?

解决方案 »

  1.   

    首先,DAO中的这种方法不好
    public Long execureHQL(String hql);
    起码有个public Userinfo findByUserid(String userid)这种
    这样service里就不需要拼装了。
      

  2.   

    UserinfoDAO userDao = new UserinfoDAOImpl();
    这句杂不用spring管理了啊,管理的话会减少代码耦合的,UserinfoServicesImpl中的longLogin 看起来很不爽 
    因为用的是拼装sql语句,hql中的setParameter()方法都用不到 
    感觉这里问题很大,请问如何修改? 
    楼主能不能把问题在描述一下,不太明白?拼装sql语句就不爽了吗??呵呵,描述的详细点
      

  3.   

    spring 不是很了解拼装sql语句,感觉不太好,
    Long long=(Long)session.createQuery("from Userinfo uinfo where uinro.id= :uid").setParameter
    ("uid",userid).uniqueResult();这样写代码看起来多整洁,但是为了重用execureHQL()
    我所知道的方法就是拼装sql 了,你们也是这样写的吗?
      

  4.   

    那就换成这样String hql = "FROM Userinfo AS u WHERE u.userid=? AND u.userpw=?";
    Query q = super.getSession().createQuery(hql);
    q.setString(0, uid);
    q.setString(1, pw);
    貌似你没用到spring
      

  5.   

    lz是想要这种吗?private Long longLogin(String uid, String pw)
        {
            StringBuffer buffer = new StringBuffer("select count(*) from Userinfo uinfo where 1 = 1");
            List params = buildHql(buffer, uid, pw);
            List list = doquery(buffer.toString(), params.toArray());
    if(list > 0){
    return list.get(0);
    }

            return monthSale;
        }


    private List buildHql(StringBuffer buffer,String uid, String pw)
    {
    List params = new ArrayList();
    if (uid != null)
    {
    buffer.append(" and s.sellBackBill.seller.id = ?");
    params.add(staff);
    }
    if (fpw != null)
    {
    buffer.append(" and uinfo.userpw = dbo.md5("?"));
    params.add(pw);
    }
    return params;
    }protected List doquery(final String hql, final Object[] values) {
    return getHibernateTemplate().executeFind(new HibernateCallback() {
    public Object doInHibernate(Session session) throws HibernateException {
    Query query = session.createQuery(hql);
    for (int i = 0; values != null && i < values.length; i++) {
    Object value = values[i];
    query.setParameter(i, value);
    }
    return query.list();
    }
    }
    });
    }
      

  6.   

    和修改 接口没有关系,是修改接口的实现类,这种 set 参数方式的SQL,自己改改吧。
      

  7.   

    这个方法:longLogin应该定义在Dao里面吧,Service里面就调用Dao的方法就行了啊
    你这个方法:execureHQL,感觉被你封装的更复杂了,到不如直接调用来的快。
    你想要“因为用的是拼装sql语句,hql中的setParameter()方法都用不到”这个效果,是不是应该在impl中去封装好呢!!!
      

  8.   

    如果我需要返回所有的用户id数,那我是不是又得重新写一个方法
    然后dao层又重新写一篇重复的代码,所以我觉得 longLogin还是应该写在业务逻辑层
      

  9.   

    其实我们做项目时,也用到拼装SQL;语句,就好比 在你做有条件的查询时就会 用到,比如说,你的系统有查询功能,并且可以根据一个条件查,还可以根据多个条件查,这时你写SQL语句就不能确定用户是按几个条件查了(用户可以按照自己的意愿想选择几个查询条件就选几个)这时我们通常都是拼装的SQL语句。
      

  10.   

    其实spring也不难,主要就是学一个IOC 和aop ,楼主仔细看看视频,做个小例子,就可以了,视频推荐看张孝祥的。