一、HQL语句中数据类型转换:

  我们需要从数据库中取出序号最大的记录,想到的方法就是使用order by子句进行排序(desc倒序),然后取出第一个对象,可是当初设计数据库时(我们是在原来的数据库的基础上开发新系统),竟然将序号字段的类型设成了varchar2,真是让人郁闷,这样的话,如果排序的话,就是对字符串排序,12是比2小的数,那么就需要转换一下类型。

以下写法调整中是错误的,不能执行,报空指针错误:select cast(t.a as Integer) from table_1 t

我也使用了这段代码,同样报空指针异常,不知道怎么回事,我的脑袋里突然冒出一个想法,将Integer的I变为小写,代码如下:

public List findByPlanId(String id){
return getHibernateTemplate().find("from edu.bjtu.port.domain.DetailOfPlanForDayAndNight p where p.id.planId=? order by cast(p.id.detailId as integer) desc",id);
}

  这样就成功了。

这段代码的另一个让我注意的地方是,当使用复合主键时,创建一个主键类,然后想要使用其中的一个主键进行查询,必须要这样写  p(实体类).id(主键类).planId(其中的某个主键),下面是对应的配置文件:

  XML代码:

<class name="edu.bjtu.port.domain.DetailOfPlanForDayAndNight" table="PD1_DNPLAN_DTL" schema="SOMIS">
<composite-id name="id" class="edu.bjtu.port.domain.DetailOfPlanForDayAndNightId">
<key-property name="planId" type="java.lang.String">
<column name="DNPLANID" length="" />
</key-property>
<key-property name="detailId" type="java.lang.String">
<column name="NO" length="" />
</key-property>
</composite-id>

  其实这个问题在Hibernate开发手册中有写,只是我还没看到,之所以想到这样写,完全是突然灵光乍现。不过看来手册还要继续好好研究啊~

实例:HQL语句中cast(version as integer),小写

public GenuineManagementStatic queryNewVersion(Integer softId) {
List<GenuineManagementStatic> list = getSession().createQuery(" from " + this.clazz.getName() + " this WHERE this.softId=:softId order by cast(version as integer) desc LIMIT 0,1")
.setParameter("softId", softId)
.list();
if (list.size() > ) {
return list.get();
}
return null;
}

二、hibernate中createQuery执行hql报错:

1、实体类和数据库的表不能映射在一起。

  报错的代码:

org.hibernate.hql.ast.QuerySyntaxException: news is not mapped [select id, type,title ,author,message,date from news where type =  order by date desc]
org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:)
org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:)
org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:)
org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:)
org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:)

  解决方法:修改sql语句

select id, type,title ,author,message,date from News where type =  order by date desc

  数据库名和实体名,千万要注意

2、将1中的hql语句修改之后,别以为万事大吉,其实暗藏一个问题:就是使用  Interator 遍历是会出现类似这样的错误,如果不遍历只求大小的话,还好,可以正常得出结果,但是一旦遍历,始终得不出结果。

  仔细查看问题就出在这个hql语句上。

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xzsz.model.News
com.xzsz.dao.impl.NewsDaoImpl.getNews(NewsDaoImpl.java:)
com.xzsz.service.impl.NewsServiceImpl.getNews(NewsServiceImpl.java:)
sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
java.lang.reflect.Method.invoke(Method.java:)

  解决方法,将hql语句修改为:from News where type = 1 order by date desc

  另外,可以限制查询条数(10条)

Query q = this.getSession().createQuery(hql);
//限制条数
q.setFirstResult();
q.setMaxResults();
return q.list();

HQL语句中数据类型转换,及hibernate中createQuery执行hql报错的更多相关文章

  1. 在mysql 5.7中,创建表的字段名中包含双引号的时候,执行会报错

    解决办法,添加 SET SESSION SQL_MODE=ANSI_QUOTES;

  2. JS中数据类型转换

    JS中数据类型转换汇总 JS中的数据类型分为 [基本数据类型] 数字 number 字符串 string 布尔 boolean 空 null 未定义 undefined [引用数据类型] 对象 obj ...

  3. JavaScript中数据类型转换总结

    JavaScript中数据类型转换总结 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = " ...

  4. Java中数据类型转换&基本类型变量和对象型变量

    1.Java的数据类型分为三大类 布尔型,字符型和数值型 其中数值型又分为整型和浮点型 2.Java的变量类型 布尔型 boolean 字符型 char 整型    byte,short,int,lo ...

  5. PHP中数据类型转换的三种方式

    PHP中数据类型转换的三种方式 PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: 1.(int).(integer):转换成整形2.(float).(double).(real):转换成 ...

  6. Java基础知识强化之IO流笔记46:IO流练习之 把文本文件中数据存储到集合中的案例

    1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据 ...

  7. c#中的里氏转换和Java中强制类型转换在多态中的应用

    在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...

  8. 检验Excel中数据是否与数据库中数据重复

    #region 记录Excel中的重复列 /// <summary> /// 记录Excel中的重复列 /// </summary> /// <param name=&q ...

  9. MySQL在windows系统中修改datadir路径后无法启动问题,报错1067

    windows server2008下如何更改MySQL数据库的目录的帖子已经很多了,这里简单介绍一个步骤,如果不成功请先查看其它帖子. 更改默认的mysql数据库目录 将 C:\Documents ...

随机推荐

  1. Spring boot 集成hessian - LocalDateTime序列化和反序列化

    - 反序列化 import com.caucho.hessian.HessianException; import com.caucho.hessian.io.AbstractDeserializer ...

  2. memcached安装+绑定访问ip

    安装: 1.由于memcached是基于libevent的,需要安装libevent,libevent-devel $yum -y install libevent libevent-devel 2. ...

  3. html5 -audio-移动端如何自动播放

    最近在做一些活动类页面或者类似于易企秀类型的轻应用经常遇到关于audio标签的应用,对于audio相关的常用知识点以及一些相关的问题如下: <audio id="audios" ...

  4. 原生DOM选择器querySelector和querySelectorAll

    在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...

  5. IIS 安装问题

    今天去客户现场的内网环境安装IIS,结果第一步尴尬,是虚拟机搭出来,安装时没有源文件,然后让那边运维给系统盘挂上了,第一步通过了,可以安装了,但是由于之前也没吝啬,啥都点了,这次就合计不用那么多,结果 ...

  6. oracle Lower Upper length substr

    字符函数: Lower(char):将字符串装换为小写的格式 Upper(char):将字符串装换为大写的格式 length(char):返回字符串的长度 substr(char,m,n):从m开始截 ...

  7. Python lambda介绍(转)

    在学习python的过程中,lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda? 下面就上面的问题进行一下解答. 1.lambda是什么? ...

  8. 手机发送验证码—.net代码

    注册过程中,短信发送验证码流程如下: (1).用户提交手机号码,申请湖区验证码 (2).网站按照预制规则生成验证码 (3).网站将用户手机号码和验证码发送到短信平台 (4).将制定内容发送到制定手机号 ...

  9. 安卓android破解方法

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha  313134555@qq.com 如何给smali文件中的unicode字符串添加中文注释 如何注释掉smali文件中包含关键字 ...

  10. [USACO 2018 Jan Gold] Tutorial

    Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...