1. 程式人生 > >hql 條件查詢 返回空的一種情況

hql 條件查詢 返回空的一種情況

為何會出現查詢為空,但是查詢整個表沒問題的情況呢?

這裡是沒有分清字串和變數 

原來寫的是,

String hql = "from ClientInfoModel where clientIp=?";
        Query query = session.createQuery(hql);
        query.setString(0, “cip”);
List
<ClientInfoModel> allCientInfo = query.list();

 

改正後的

String hql = "from ClientInfoModel where clientIp=?";
        Query query 
= session.createQuery(hql); query.setString(0, cip); List<ClientInfoModel> allCientInfo = query.list();

 

正確的參考

1、  第一種,用?佔位符,如:
//登入(用?佔位符)
 public List<UserPO> LoginUser(UserPO up)throws Exception{
  Session session = HibernateSessionFactory.getSession();
  String hql 
= "from UserPO where name = ? and pwd= ?"; Query query = session.createQuery(hql); query.setString(0, up.getName()); query.setString(1, up.getPwd()); List<UserPO> list = query.list(); session.close(); return list; } 2、用“:+命名”佔位符,如: //登入(用":命名"佔位符) public List<UserPO> LoginUser2(UserPO up)throws Exception{ Session session
= HibernateSessionFactory.getSession(); String hql = "from UserPO where name = :n and pwd= :p"; Query query = session.createQuery(hql); query.setString("n", up.getName()); query.setString("p", up.getPwd()); List<UserPO> list = query.list(); session.close(); return list; } 2.1、使用這種佔位符還可以這樣設值,如: //登入(用":命名"佔位符,用setParameter設值) public List<UserPO> LoginUser3(UserPO up)throws Exception{ Session session = HibernateSessionFactory.getSession(); String hql = "from UserPO where name = :n and pwd= :p"; Query query = session.createQuery(hql); query.setParameter("n", up.getName()); query.setParameter("p",up.getPwd()); List<UserPO> list = query.list(); session.close(); return list; } 使用這種方式不需要寫明對映的型別,Hibernate會通過配置自動給我們轉,但是由於Hibernate有兩種日期格式:Date和TIMESTAMP,所以對於日期型別必須寫明對映的型別。寫法: 3、按照物件進行引數繫結,如: //登入(用":命名"佔位符,用setProperties設值,命名引數必須要與被繫結的屬性名相同) public List<UserPO> LoginUser4(UserPO up)throws Exception{ Session session = HibernateSessionFactory.getSession(); String hql = "from UserPO where name = :name and pwd= :pwd"; Query query = session.createQuery(hql); query.setProperties(up); List<UserPO> list = query.list(); session.close(); return list; } 4、使用條件查詢(Criteria),如: //登入(用條件查詢 Criteria)完全脫離sql語句和hql語句 public List<UserPO> LoginUser5(UserPO up)throws Exception{ Session session = HibernateSessionFactory.getSession(); Criteria cri = session.createCriteria(UserPO.class); cri.add(Restrictions.eq("name", up.getName())); cri.add(Restrictions.eq("pwd", up.getPwd())); List<UserPO> list = cri.list(); session.close(); return list; } 5、離線條件查詢,如: //登入(用離線條件查詢 DetachedCriteria) public List<UserPO> LoginUser6(UserPO up)throws Exception{ Session session = HibernateSessionFactory.getSession(); DetachedCriteria dc = DetachedCriteria.forClass(UserPO.class); dc.add(Restrictions.eq("name", up.getName())); dc.add(Restrictions.eq("pwd", up.getPwd())); Criteria cri = dc.getExecutableCriteria(session); List<UserPO> list = cri.list(); session.close(); return list; } 使用離線可以將其寫在業務層,以引數的形式傳入,以減少DAO的程式碼。 6、分頁查詢:分頁查詢是資料庫應用中的處理方式,query和criteria介面都提供了用於分頁查詢的方法: 1) setFirstResult(int):指定從哪一個物件開始查詢,引數是索引位置,從0開始。 2) setMaxResult(int):指定一次最多查詢的物件數量。