先贴出在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使用别名,而自己使用?,是得不到别名.字段的,使用两个?本来是考虑降低其耦合性,不过细想,使用目前这样的方式同样达到效果,也就用一个?了,而若要用?占字段名这个暂时还没想到