hibernate3.2查询记录数 的相关问题
2011-05-02 16:42
399 查看
先贴出在struts的action中会调用hibernate的代码段
其中registerValidator方法就是后面要提到的hibernate查询记录操作,在另外一个类中出现
以下为registerValidator方法:
1.返回数据的转换。
数据需要注意,hibernate3.2以前,在HQL中使用count(*)返回的是int,而后随着JPA标准的改变,为了与JPA兼容,而改为返回Long
为了保证数据类型的转换成功,先统一转为Number型
这是一些比较有价值的参考:
1> “如果你从Hibernate 3.0.x/3.1.x升级到最新的3.2版,一定要注意,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。”
2> “因为无论是Long还是Integer,还是BigInteger,它们都是Number的子类,所以用Number去cast这个结果是肯定不会错的,然后,最好定义在Number里面这些方法可以统一的返回需要的类型;
byte byteValue()
以 byte 形式返回指定的数值。
abstract double doubleValue()
以 double 形式返回指定的数值。
abstract float floatValue()
以 float 形式返回指定的数值。
abstract int intValue()
以 int 形式返回指定的数值。
abstract long longValue()
以 long 形式返回指定的数值。
short shortValue()
以 short 形式返回指定的数值。
=====================================================
java.lang
类 Number
java.lang.Object
java.lang.Number
所有已实现的接口:
Serializable
直接已知子类:
AtomicInteger, AtomicLong, BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short ”
2.java中long与Long有什么区别
“Java的数据类型分两种:
1.基本类型:long,int,byte,float,double,char
2. 对象类型(类): Long,Integer,Byte,Float,Double,Char,String,其它一切java提供的,或者你自己创建的类。
其中Long又叫 long的包装类。而Byte和Float也类似,一般包装类的名字首写是数值名的大写开头。
什么叫包装类?
在java中有时候的运算必须是两个类对象之间进行的,不充许对象与数字之间进行运算。所以需要有一个对象,这个对象把数字进行了一下包装,这样这个对象就可以和另一个对象进行运算了。
比如我们也可以定义一个类:
class Long {
int i=0;
public Long (int i){
this.i=i;
}
}
这样这个Integer就是一个包装类,他包装了一个整数值,然后可以在里面写一些运算符重载的方法使它支持某些运算。这个时候可以赋值:
Long it=new Long(10);
现在变量it就是一个对象,不是一个数字。
long 是长整型,在怎么长本身也是整型,12.10的整形部分是12,当然结果是12,
byte: 八位整数 -128——127,可用来节省内存的使用。
short: 16位整数 -32768——32,767,也比较省内存。
int: 32位整数 -2,147,483,648——2,147,483,647,一般来说整数都够用了
long: 64位整数 -9,223,372,036,854,775,808—— 9,223,372,036,854,775,807,一般不需要用
float: 32位浮点,如果浮点需要节省内存用这个。
Double: 64位浮点,一般非整数浮点可用这个。
但是要记住float和double都不是精确的,如果要储存钱一类的必须精确的,用java.math.BigDecimal”
3.HQL占位符"?"使用的问题
之前我使用的是两个 ? 进行占位:
hql= "select count(*) FROM User WHERE ?=? ";
但发现使用出错,查看控制台输出:Hibernate: select count(*) as col_0_0_ from user user0_ where ?=?
觉得应该是占位符出了问题,后修改为一个?
hql= "select count(*) FROM User WHERE loginname=? ";
没有问题,查看控制台输出:Hibernate: select count(*) as col_0_0_ from user user0_ where user0_.loginname=?
问题就在 user0_.loginname上,hibernate使用别名,而自己使用?,是得不到别名.字段的,使用两个?本来是考虑降低其耦合性,不过细想,使用目前这样的方式同样达到效果,也就用一个?了,而若要用?占字段名这个暂时还没想到
其中registerValidator方法就是后面要提到的hibernate查询记录操作,在另外一个类中出现
HbManager hc = new HbManager(); boolean flag =true; String hql; //判断loginname是否已经被使用 hql= "select count(*) FROM User WHERE loginname=? "; flag = hc.registerValidator(hql, this.getLoginname()); if(flag){ addFieldError("loginrepeat", "账号已被使用"); return INPUT; }
以下为registerValidator方法:
//判断注册时某字段是否已经被注册,若存在返回真 @SuppressWarnings("rawtypes") public boolean registerValidator(String hql,String fieldValue){ this.doConfiguration(); this.openSession(); Number count = (Number)session.createQuery(hql).setString(0, fieldValue).iterate().next(); this.closeSession(); //count大于0,则存在,返回真 if(count.intValue()>0){ return true; } else { return false; } }
1.返回数据的转换。
数据需要注意,hibernate3.2以前,在HQL中使用count(*)返回的是int,而后随着JPA标准的改变,为了与JPA兼容,而改为返回Long
为了保证数据类型的转换成功,先统一转为Number型
这是一些比较有价值的参考:
1> “如果你从Hibernate 3.0.x/3.1.x升级到最新的3.2版,一定要注意,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。”
2> “因为无论是Long还是Integer,还是BigInteger,它们都是Number的子类,所以用Number去cast这个结果是肯定不会错的,然后,最好定义在Number里面这些方法可以统一的返回需要的类型;
byte byteValue()
以 byte 形式返回指定的数值。
abstract double doubleValue()
以 double 形式返回指定的数值。
abstract float floatValue()
以 float 形式返回指定的数值。
abstract int intValue()
以 int 形式返回指定的数值。
abstract long longValue()
以 long 形式返回指定的数值。
short shortValue()
以 short 形式返回指定的数值。
=====================================================
java.lang
类 Number
java.lang.Object
java.lang.Number
所有已实现的接口:
Serializable
直接已知子类:
AtomicInteger, AtomicLong, BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short ”
2.java中long与Long有什么区别
“Java的数据类型分两种:
1.基本类型:long,int,byte,float,double,char
2. 对象类型(类): Long,Integer,Byte,Float,Double,Char,String,其它一切java提供的,或者你自己创建的类。
其中Long又叫 long的包装类。而Byte和Float也类似,一般包装类的名字首写是数值名的大写开头。
什么叫包装类?
在java中有时候的运算必须是两个类对象之间进行的,不充许对象与数字之间进行运算。所以需要有一个对象,这个对象把数字进行了一下包装,这样这个对象就可以和另一个对象进行运算了。
比如我们也可以定义一个类:
class Long {
int i=0;
public Long (int i){
this.i=i;
}
}
这样这个Integer就是一个包装类,他包装了一个整数值,然后可以在里面写一些运算符重载的方法使它支持某些运算。这个时候可以赋值:
Long it=new Long(10);
现在变量it就是一个对象,不是一个数字。
long 是长整型,在怎么长本身也是整型,12.10的整形部分是12,当然结果是12,
byte: 八位整数 -128——127,可用来节省内存的使用。
short: 16位整数 -32768——32,767,也比较省内存。
int: 32位整数 -2,147,483,648——2,147,483,647,一般来说整数都够用了
long: 64位整数 -9,223,372,036,854,775,808—— 9,223,372,036,854,775,807,一般不需要用
float: 32位浮点,如果浮点需要节省内存用这个。
Double: 64位浮点,一般非整数浮点可用这个。
但是要记住float和double都不是精确的,如果要储存钱一类的必须精确的,用java.math.BigDecimal”
3.HQL占位符"?"使用的问题
之前我使用的是两个 ? 进行占位:
hql= "select count(*) FROM User WHERE ?=? ";
但发现使用出错,查看控制台输出:Hibernate: select count(*) as col_0_0_ from user user0_ where ?=?
觉得应该是占位符出了问题,后修改为一个?
hql= "select count(*) FROM User WHERE loginname=? ";
没有问题,查看控制台输出:Hibernate: select count(*) as col_0_0_ from user user0_ where user0_.loginname=?
问题就在 user0_.loginname上,hibernate使用别名,而自己使用?,是得不到别名.字段的,使用两个?本来是考虑降低其耦合性,不过细想,使用目前这样的方式同样达到效果,也就用一个?了,而若要用?占字段名这个暂时还没想到
相关文章推荐
- Hibernate查询相关问题记录
- Hibernate中用left join(左外连接)查询映射中没有关联关系的两个表记录问题
- this.getHibernateTemplate().find()出现查询到的记录重复的问题
- [Hibernate]在用hibernate3.0进行查询时,java.lang.NoClassDefFoundError: antlr/ANTLRException【问题记录】
- hibernate 分页查询求总记录数遇到的问题
- hibernate5.2.4做多表查询时出现异常的相关问题
- Hibernate3.2 中使用视图 查询记录重复
- 关于Hibernate中fatch=eager的bag集合(一个java List)使用Criteria查询出现重复记录的问题
- 关于hibernate查询视图时,相同主键的两条记录映射问题【已解决】
- 关于hibernate查询视图时,相同主键的两条记录映射问题【已解决】
- 关于Hibernate查询获取多个字段的记录并封装的方法
- 关于 hibernate 逻辑删除 默认查询过滤条件问题(java set 条件)
- 利用postgresql进行缓冲区内对象检测过程中遇到的sql查询效率问题解决方案记录
- N+1 查询问题(hibernate)
- SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。
- 摩托罗拉SE4500 三星 S3C6410 Wince6.0平台软解码调试记录以及驱动相关问题解释
- 使用Spring + Struts + Hibernate开发网站 -- 问题记录
- 使用jbpm3.2.3时,通过流程名查询流程的奇怪问题
- 慢查询slowlog记录日志问题
- 微信平台开发相关的问题记录