Query和Criteria接口:都是查询接口,query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。
Criteria接口完全封装了基于字符串形式的查询语句,比query接口更面向对象,他擅长执行动态查询。
sessoin接口的find方法也具有数据查询功能,但他只是执行一些简单的hql查询语句的快捷方式,远没 有query接口功能强大。
String hql=from BookInfo b where b.isbn like ? and b.lname like ?;
hql.setParameter(0," 111111");
hql.setParameter(1," zhen");
Query query=getSession().createQuery(hql);
0 代表Parameter所在参数数组的index。
//很多时候eclipse提示getSession().createSQLQuery(hql);这样查询就会出错,因为这个方法是针对原生的SQL。
//通过ID或者名字的模糊查询获取 User
public List<Login> listUserByEmployeeIdOrLastName(String str) {
String query =
"select l from Login l, Person p " +
"where l.dirty = 0 AND p.dirty = 0 AND l.userType = :userType and l.person.personId = p.personId " +
"and (l.userName like :employeeId OR p.lastName like :lastName ) order by p.firstName";
String userQueryStr = str+"%";
Query hql= getSession().createQuery(query);//创建query对象
hql.setParameter("userType", Login.USER_TYPE_EMPLOYEE);//占位符赋值
hql.setParameter("employeeId", userQueryStr);
hql.setParameter("lastName", userQueryStr);
List<Login> list = hql.list();//查实返回对象数组(object【】)
return list;
}
==========细心的会看到有三个:冒号。========
这里的作用是占位符,在Query 实例后进行setParameter,相当于上面的?赋值。
这样比较直观,不容易因为写代码时参数的位置问题导致出错。