您的位置:首页 > 产品设计 > UI/UE

使用Hibernate SQLQuery执行原生SQL

2017-03-03 09:02 399 查看
Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询:

session.createSQLQuery(String sql);

SQLQuery实现了Query接口,因此你可以使用Query接口中提供的API来获取数据。

最简单的示例

//获取所有查询结果

session.createSQLQuery(“select * from note”).list();

//仅获取第一条结果

session.createSQLQuery(“select * from note where id = 1”).uniqueResult();

使用预处理SQL

预处理SQL的好处自然不必多说,除了众所周知的能够防止SQL注入攻击外,还能够在一定程度上提高SQL的查询效率。SQLQuery提供了众多的接口来分别设置不同类型的参数,诸如setBigDecimal、setBinary、setDouble等,详参SQLQuery的JavaDoc,此处不再赘述。这里仅重点说一下通用的SQL参数设置接口setParameter。

如下代码示范了如何使用SQLQuery执行预处理SQL:

SQLQuery query = session.createSQLQuery(“select * from note where id = ?”);

//设置第一个参数的值为12,即查询ID=12的note

query.setParameter(0, 12);

List list = query.list();



这里需要注明一点, 无论是通过不同类型参数的设置接口来设置SQL参数,还是通过setParameter来设置参数,下标都是从0开始的,而不是从1开始的 !

使用自定义的结果转换器处理查询结果

SQLQuery接口预留了setResultTransformer接口以实现使用用户自定义的ResultTransformer结果集转换器处理查询结果。ResultTransformer接口非常简单,只有两个方法,分别用来转换单行数据和所有结果数据。经过自定义ResultTransformer生成的实体,并未加入Session,因此是非受管实体。

如下代码,示范了如何将单行数据装入LinkedHashMap对象中:

query.setResultTransformer(new ResultTransformer() {

@Override

public Object transformTuple(Object[] values, String[] columns) {

Map
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: