zoukankan      html  css  js  c++  java
  • Hibernate中createQuery与createSQLQuery两者的区别

     最近几天在写项目,遇到了一个错:

    Struts has detected an unhandled exception:
    Messages: 

        ORA-00933: SQL ???????
        could not execute query
        could not execute query; SQL [ select count(*) from www.csdn.weibo.domain.Pictures where 1=1 and picture_type='aaa']; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query

    File:  oracle/jdbc/driver/DatabaseError.java
    Line number:  112
    Stacktraces
    org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [ select count(*) from www.csdn.weibo.domain.Pictures where 1=1 and picture_type='aaa']; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query

    在论坛发贴了,看到大家的回复我也改了改,还是没查询不到,于是乎请教老师吧,老师上来就看出问题了,唉唉,并且要我细看hibernate ,createQuery与createSQLQuery两者的区别,所以我先把我的错误展示给大家,然后再看他们的区别。

    终于找到问题了 原来是把createQuery和createSQLQuery弄混了,在baseDaoImpl.java 里边我原来写的是

    Java code
     
    ?
    1
    2
    3
    return  Integer.valueOf((session.createSQLQuery(
                             " select count(*) from "  + clazz.getName() +  " "
                                     + whereSql).uniqueResult() +  "" ));


    在jsp中拼接sql语句中写的是

    Java code
     
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private  String spliceSql() {
             String whereSql =  " where 1=1 " ;
     
             if  (user !=  null  && user.getId() !=  null  && ! "" .equals(user.getId())) {
                 whereSql +=  " and user_id="  + user.getId() +  " " ;
             }
     
             if  (pictures !=  null  && pictures.getType() !=  null
                     && ! "" .equals(pictures.getType())) {
                 whereSql +=  " and picture_type='"  + pictures.getType() +  "'" ;
             }
             return  whereSql;
             
         }



    应该改为这样的,

    Java code
     
    ?
    1
    2
    3
    4
    return  Integer.valueOf(session.createQuery(
                             "select count(alias) from "  + clazz.getName()
                                     " as alias " +whereSql).uniqueResult()
                             "" );



    Java code
     
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private  String spliceSql() {
             String whereSql =  " where 1=1 " ;
     
             if  (user !=  null  && user.getId() !=  null  && ! "" .equals(user.getId())) {
                 whereSql +=  " and picture.user.id="  + user.getId() +  " " ;
             }
     
             if  (pictures !=  null  && pictures.getType() !=  null
                     && ! "" .equals(pictures.getType())) {
                 whereSql +=  " and picture.type='"  + pictures.getType() +  "'" ;
             }
             return  whereSql;
             
         }

    下面是从网上找的很有用:

    createQuery与createSQLQuery区别  :

    前者用的hql语句进行查询,后者可以用sql语句查询
    前者以hibernate生成的Bean为对象装入list返回
    后者则是以对象数组进行存储
    所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便
    突然发现createSQLQuery有这样一个方法可以直接转换对象
    Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
    XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。



  • 相关阅读:
    查看windows下指定的端口是否开放
    网易云音乐评论爬虫:爬取歌曲的全部评论
    用 Python 玩转 GitHub 的贡献板
    用python实现linux口令破解
    Python 音频数据扩充的技巧
    教你使用python+Opencv完成人脸解锁
    opencv+Python特征检测及K-最近邻匹配
    opencv+python 统计及绘制直方图
    学会用这个工具做分析,1年积累3年工作经验
    15分钟,教你用Python爬网站数据,并用BI可视化分析!
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3078439.html
Copyright © 2011-2022 走看看