`
jinnianshilongnian
  • 浏览: 21435208 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2405130
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997788
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631528
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257583
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593212
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248982
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847622
Group-logo
跟我学Nginx+Lua开...
浏览量:698184
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780495
社区版块
存档分类
最新评论

hibernate SQLQuery oracle BUG

 
阅读更多

数据库:

oracle

测试的有问题的版本:

   hibernate 3.6.0.Final

   hibernate 4.2.0.Final

 如果用的库如mysql 也不会有问题。

 

代码:

SQLQuery q = session.createSQLQuery("select name from tbl_user");
q.setFirstResult(N);
q.setMaxResults(3);
System.out.println(q.list());

 如果q.setFirstResult(0); 取第一页没问题,生成的sql如下所示:

Hibernate: 
    select
        * 
    from
        ( select
            name 
        from
            tbl_user ) 
    where
        rownum <= ?
[null, 2, null]

此时没问题。 

 

 如果q.setFirstResult(1); 取第一页没问题,生成的sql及打印的结果如下所示:

Hibernate: 
    select
        * 
    from
        ( select
            row_.*,
            rownum rownum_ 
        from
            ( select
                name 
            from
                tbl_user ) row_ 
        where
            rownum <= ?
        ) 
    where
        rownum_ > ?
[[Ljava.lang.Object;@1e6d4a8, [Ljava.lang.Object;@1938886, [Ljava.lang.Object;@e8259c]

 可以看到结果是Object数组,而不是单个name值,可以看出主要原因是第二页分页需要加一个rownum造成的。

 

 

解决方案,使用hibernate标量:

q.addScalar("name", StringType.INSTANCE);

 这样就不会有问题了。

 

已提交给hibernate jira

https://hibernate.atlassian.net/i#browse/HHH-8258

4
4
分享到:
评论
3 楼 jinnianshilongnian 2013-06-19  
shmily2038 写道
使用原生sql,oracle映射为非持久化对象,所有字段都自动转为大写了,但是非持久化对象的属性以驼峰式命名,这个也会报错。 不清楚解决了?


这个不应该算是bug, 这个是正常的;取数据库元数据时
解决办法:
1、起别名:FIRSTNAME as firstName  如果不行,可以使用区分大小写的方式如oracle  FIRSTNAME as "firstName" mysql FIRSTNAME as `firstName`
2、定自定义ResultTransformer去实现
2 楼 shmily2038 2013-06-19  
使用原生sql,oracle映射为非持久化对象,所有字段都自动转为大写了,但是非持久化对象的属性以驼峰式命名,这个也会报错。 不清楚解决了?
1 楼 steafler 2013-05-23  
楼主,大牛呀,这些问题都能发现

相关推荐

Global site tag (gtag.js) - Google Analytics