hibernate框架怎么实现带where参数的指定列的查询语句,用spring整合了 50

例如查询语句:selectuserid,useragefromUserswhereusername=?anduserpwd=?... 例如查询语句 : select userid,userage from Users where username=? and
userpwd = ?
展开
 我来答
在晴天的雨伞
2016-05-23 · TA获得超过6869个赞
知道大有可为答主
回答量:5761
采纳率:86%
帮助的人:1195万
展开全部
是hibernate官方推荐的查询模式,比Criteria功能更强大。
1) 实体查询:出现类名和属性名必须注意大小写区分;当不同路径下存在相同类名,需要写入在hql中写入包名;查询目标实体存在着继承关系,将查询目标的所有子类的库表记录一起返回。
String hql = “from TUser”;
Query query = session.createQuery(hql);
List list = query.list();
2) 属性查询:有时页面不需要取整个对象,而只取某个属性。
List list = session.createQuery(“select user.name user.age from TUser user”).list();
Iterator it = list.iterator();
while(it.hasNext())
{
//返回的list中,每个条目都是一个对象数组,依次包含我们所获取的数据。
Object[] results = (Object[])it.next();
System.out.println(results[0]);
System.out.println(results[1]);
}
注:如果觉得返回数组的方式不够灵活,可以在HQL中构造对象实例。
List list = this.session.createQuery(“select new TUser(user.name,user.age) from TUser user”).list();
Iterator it = list.iterator();
while(it.hasNext())
{
TUser user = (TUser)it.next();
System.out.println(user.getName());
}
注:通过HQL动态构造对象实例,此时查询结果中的TUser对象只是一个Java对象,仅用于对查询结果的封装,除了在构造时赋予的属性值之外,其他属性均为未赋值状态,当我们通过session对此对象进行更新,将导致对user对象的数据库插入一条新数据,而不是更新原有对象。
我们也可以在HQL的select子句中使用统计函数(count(*),min(user.age))、SQL函数(upper(user.name))、distinct关键字。
1) 参数绑定
在HQL语句中直接写入where语句后面的条件值,不能满足参数为变量,如果参数设置变量,存在以下缺陷:a)编码凌乱,可读性降低;b)难以进行性能优化,JDBC以及数据库操作原理,每次执行SQL,数据库都将对SQL语法解析和优化,将处理结果保存在缓存中,以后参数不同语法相同的SQL命令直接以缓存结果加以执行,从而避免了SQL解析和优化的开销,如果传入具体值,根据值不同将视为两个SQL语句,无法利用缓存提高性能;c)引入额外的安全风险,where name=’”+username+”’ and password=’”+password+”’”;在登录网页上输入用户名:“Eric ’or‘ x ’=’ x”密码随意,根据输入拼装的HQL语句是where name=’Cartier’ or ‘x’=’x’ and password=’arbitrary’,由于被添加进了or ‘x’=’x,所以系统登录成功。这就是SQL Injection攻击的基本原理。
Hibernate 参数绑定
//Session.find方法中填充参数
session.find(“from TUser where name=?”,”Erica”,Hibernate.STRING);
//多参数情况
Object[] args = new Object[]{“Erica”,new Integer(20)};
Type[] types = new Type[]{Hibernate.STRING,Hibernate.INTEGER};
session.find(“from TUser where name=? and age>?”,args,types);
//引用占位符
String hql = “from TUser where name=:name”;
Query query = session.createQuery(hql);
query.setParameter(“name”,”Erica”);
Iterator it = query.list().iterator();
while(it.hasNext())
{
TUser user = (TUser)it.next();
System.out.println(user.getName());
}
注:“:name”就是引用占位符,标识一个名为“name”的查询参数,setParameter对参数进行填充。
//用JavaBean封装查询参数
class UserQuery{
private String name;
private Integer age;
………getter/setter
}
String hql =” from TUser where name=:name and age=:age”;
Query query = session.createQuery(hql);
UserQuery uq = new UserQuery();
uq.setName(“Erica”);
uq.setAge(new Integer(20));
query.setProperties(uq);
Iterator it = query.iterate();
while(it.hasNext())
{
TUser user = (TUser)it.next();
System.out.println(user.getName());
}

附上出处链接:http://langgufu.iteye.com/blog/1578182
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式