您的位置:首页 > 数据库

hibernate 原生sql 命名查询

2011-07-14 23:56 225 查看
sql-query中必须把表所有的列写全才可以,否则会出现‘列名无效’的错误 ,除非你使用return-scalar来设置字段类型。

使用return-property来明确地指定字段/别名,但是列字段要写全,

两种配置方式:

<sql-query name="selectBlogsByContent">
<return alias="t" class="cn.enjoylife.hibernate.bean.Blog" >
</return>
SELECT {t.*}
FROM blog t
WHERE t.content LIKE :contentPattern
</sql-query>


<sql-query name="selectBlogsByContent">
<return alias="blog" class="cn.enjoylife.hibernate.bean.Blog" >
<return-property name="id" column="id"></return-property>
<return-property name="title" column="title"></return-property>
<return-property name="content" column="content"></return-property>
<return-property name="blogAuthorId" column="blogAuthorId"></return-property>
</return>
SELECT t.id "id",
t.title "title",
t.content "content",
t.BLOG_AUTHOR_ID "blogAuthorId"
FROM blog t
WHERE t.content LIKE :contentPattern
</sql-query>


使用return-scalar来设置字段类型,查询部分字段

<!--
原生sql 如果想查询部分字段请使用return-scalar
-->
<!--
<sql-query name="selectBlogsByContent">
<return-scalar column="id" type="integer"/>
<return-scalar column="title" type="string"/>
<return-scalar column="content" type="string"/>
SELECT t.id "id",
t.title "title",
t.content "content"
FROM blog t
WHERE t.content LIKE :contentPattern
</sql-query>


查询部分字段时,返回的结果类型为List<Object[]>类型,而上两种方式的配置中因为将字段映射到了指定bean中的属性,返回的结果为List<bean名称>。

以下是查询部分字段的测试片段:

//获取部分字段的内容, 这时query.list()列表类型为List<Object[]>。
Query query = session.getNamedQuery("selectBlogsByContent");
query.setString("contentPattern", "%h%");
List<Object[]> blogs = query.list();
for(Object[] item : blogs){
System.out.println(item[0]);
System.out.println(item[1]);
System.out.println(item[2]);
}


还是这样好,使用setResultTransformer方法将查询结果转换为vo,而查询部分字段的配置不用变,依然为以上配置

测试代码:

Query query = session.getNamedQuery("selectBlogsByContent")
.setResultTransformer(Transformers.aliasToBean(Blog.class));
query.setString("contentPattern", "%h%");
List<Blog> blogs = query.list();
System.out.println(blogs);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: