上篇文章讨论了hql查询中的连接查询,它的查询语法在功能上和sql的连接查询是相同的,内连接查询取得的是关系之间的笛卡尔积,外连接查询是获取一个关系表及与另一个关系表的合集部分,具体的使用方法见上篇文章,并在最后讨论了外置命名查询的方法。该篇文章将会对hql的参数查询、函数查询及查询过滤器做详细的讨论。
一、参数查询
参数查询其实是使用等价代换的方法,使用设置的值替换字符串中指定位置的符号,或者通过使用参数名称,使用字符串来替换参数名称的值,这样能避免sql注入的问题,拼接字符串会出现sql注入的问题。hql提供了两种参数查询的方法,一种是通过使用符号“?”,然后使用setParameter方法设置替换的字符串;另外一种是使用参数名称,定义参数名称,并使用setParameter方法来替换指定参数名称的字串。
1.1 参数符号--?
通过使用符号?来设置要添加的参数内容,也就是说这里的符号?其实是hql的参数。如果想要为参数赋值,可以使用hql的方法setParameter,该方法重载参数,提供两个参数,一个能够传递参数出现的位置,另一个为参数赋值。具体如下代码:
@SuppressWarnings({ "unchecked", "rawtypes" })
public void testQuery(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//方法链编程
List students=session.createQuery("select s from Student s where s.name like ?").setParameter(0, "%0%").list();
for(Iterator iter=students.iterator();iter.hasNext();){
Student student=(Student)iter.next();
System.out.println(student.getName());
}
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
在需要使用参数的字串位置处使用?来代替,然后使用setParameter 方法,替换参数的内容。该方法中的第一个参数可以是字符串也可以是索引,如果使用了?作为参数,就必须指定?的第几个索引。
1.2 参数名称
上文已经讨论了符号参数的使用方法,并稍微简介了参数名称查询的方法,也就是说可通过使用参数名称的方法来定义参数,这种方法需要指定参数的名称,然后使用setParameter来设置名称替换参数,hql的参数定义是冒号+参数名。
@SuppressWarnings({ "unchecked", "rawtypes" })
public void testQuery(){
Session session=nu