您的位置:首页 > 其它

hibernate3.2查询记录数 的相关问题

2011-05-02 16:42 399 查看
先贴出在struts的action中会调用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使用别名,而自己使用?,是得不到别名.字段的,使用两个?本来是考虑降低其耦合性,不过细想,使用目前这样的方式同样达到效果,也就用一个?了,而若要用?占字段名这个暂时还没想到
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐