这个……太高深了些帮呆鸟顶一下,^_^hibernate我还没入门呢
解决方案 »
- weblogic12c <BEA-000402>问题
- jsp 中文问题
- JSF中FacesContext的消息队列无法显示在页面中
- struts传递参数问题
- 在线等!请教java.lang.AbstractMethodError: org.gjt.mm.mysql.Connection.createStatement(II)Ljava/sql/Statement;
- jsp页面转换
- Home接口的jndi名找不到 not bound
- struts中选项菜单select中带有一个默认值的问题。
- 第二轮面试顺利通过,谢各位版友(2)...
- IE11怎么降到IE8
- 请问一下关于java中注册侦听事件的代码?
- 安装时j2sdk1.4 for linux时提示/tmp空间不够怎么解决?
想法可行的啊, 一开始我也这样想的。不过你可以使用setParameter(String name, Object val, Type type) 而且这样做是被推荐的
因为如你查看它的原码就是Query接口的实现类。AbstractQueryImpl.java
=====================
....
public Query setParameter(String name, Object val, Type type) {
if( !actualNamedParameters.contains(name) ) {
throw new IllegalArgumentException("Parameter " + name + " does not exist as a named parameter in [" + getQueryString() + "]");
}
else {
namedParameters.put(name, new TypedValue(type, val) );
return this;
}
}
public Query setString(String name, String val) {
setParameter(name, val, Hibernate.STRING);
return this;
} public Query setTime(String name, Date date) {
setParameter(name, date, Hibernate.TIME);
return this;
} public Query setTimestamp(String name, Date date) {
setParameter(name, date, Hibernate.TIMESTAMP);
return this;
} public Query setBigDecimal(int position, BigDecimal number) {
setParameter(position, number, Hibernate.BIG_DECIMAL);
return this;
}
....
===============================
如果你想更智能的话,就用setProperties(Object bean),他就是靠反射来实现的。
这个bean需要是个VO..有一系列的getter方法
原代码
==========================
public Query setProperties(Object bean) throws HibernateException {
Class clazz = bean.getClass();
String[] params = getNamedParameters();
for (int i = 0; i < params.length; i++) {
String namedParam = params[i];
try {
Getter getter = ReflectHelper.getGetter(clazz, namedParam);
setParameter( namedParam, getter.get(bean), guessType( getter.getReturnType() ) );
}
catch (PropertyNotFoundException pnfe) {}
}
return this;
}
String queryString =
" from PartItem as partItem where partItem.tOrderCheck.OrderCheckid= " +OrderCheckid;//参数就这样加不就行了吗?管他什么样的写在HQL里面不就好了
Query query = ss.createQuery(queryString);
Iterator itr=null;
itr = query.iterate();
while (itr.hasNext()) {
}
Session session;
String loginName;
int age;
List users1 = session.find("FROM User user WHERE user.loginName = ?", loginName, Hibernate.STRING);
List users2 = session.find("FROM User user WHERE user.age > ?", age, Hibernate.INTEGER);
setProperties和setParameter觉得和我的想法有点差别。我先说说我是怎么想的。
我是这么想的。
定义一个持续化层(PersistenceLayer)操作(Operation)的接口(Interface);
定义Interface是为了以后移植方便,比方,这次我使用Hibernate,下次我可能使用CMP或者JDO来实现持续化。
我只需替换该PersistenceLayerInterface的Impl就可以了(这里可用Factory)。在这个PersistenceLayerInterface里,我定义了一个Method
public Collection getObjectListFromDBWithConditions(Object o, Collection conditions, int pageSize, int pageIndex) throws AppException;
顺便说一下,在这个Method里,我用了自定义异常(AppException);于是,我在HibernatePersistenceLayerOperImpl.class这个类里,
我企图通过
Object o
来得到我想要找的广义Object(我是觉得Hibernate这点作的不比EJB差,很对象化 OO,包含了Relationship,我很喜欢,嘻嘻)在调用getObjectListFromDBWithConditions这个Method之前,我已经创建了一些
SQLConditionBean
(它很简单,就3个成员变量:
String name;
Object value;
String conditionRelation = " and ";
是个标准JavaBean)
并把它们(SQLConditionBean)放入
Collection conditions
传给
getObjectListFromDBWithConditions在这个Method里,就像大多数Hibernate操作一样(略,直到),
sb.append(sqlCondition.getConditionRelation() + "object." + sqlCondition.getName() + "=:" + sqlCondition.getName());
(上面形成查询HQL)接下来就到了
query.setXXX(sqlCondition.getValue());因为我的sqlCondition.getValue()返回的是个Object,所以,我就希望,能够根据返回的Object Type(or Class)
来调用相应的
query.setXXX();(背景介绍完。)中午看了
setProperties
的源码之后,觉得也不是很理想,因为它需要的是一个包含对应paraName的value,而我的
SQLConditionBean
已经指定名字为
Object value;
了,所以,会报NotSuchMethodException;
我很苦恼!
其实,它(setProperties)更适合于Hibernate的DataBean,而不是我的SQLConditionBean;于是,我转而考虑
setParameter
也就是Schlemiel(维特根斯坦的扇子) 推荐的。
但是,它(setParameter)的第三个参数Type,是比较麻烦的。
以我对Hibernate的了解,我不知道有什么方法可以快捷地创建一个根据
sqlCondition.getValue()
而得到的Type???
(哪位熟悉Hibernate的可不要吝啬咯!)废话比较多,无非抛砖引玉,期待高手指点迷津。
也希望让初学者多接触一些。附:我的Hibernate完全师承 totodo(土豆仙) ,
我没有用Hibernate做过实际项目,他有。
各位Hibernate爱好者可要向他请教咯,多拍拍他马屁就可以了。嘿嘿。
我只看过Hibernate的一些API和Doc,example;
SQLConditionBean
(它很简单,就3个成员变量:
String name;
Object value;
String conditionRelation = " and ";
是个标准JavaBean)===================sigh,原来就这么个问题啊……不要太简单哦。做个映射表,键是value的真实类型,值是Hibernate的持久类型,就像这样:private static final Map _typeMap = new HashMap();
_typeMap.put(Integer.class, Hibernate.INTEGER);
_typeMap.put(String.class, Hibernate.STRING);
...再加个getType()方法:getType() {
return _typeMap.get(value.getClass());
}这么个小问题都搞不掂,sigh,笨鸟呀笨鸟。
package net.sf.hibernate.type;public final class TypeFactory {
private static final Map BASIC_TYPES;
static {
HashMap basics = new HashMap();
basics.put( boolean.class.getName(), Hibernate.BOOLEAN);
basics.put( long.class.getName(), Hibernate.LONG);
...
我是希望尽可能抽象和重复利用+Refactor;
????再Up
用TypeFactory.basic(value.getClass().getName())不就能获得对应的Type了吗?你还问个什么劲?下次再敢提这种问题!
不是啦。我一开始真的不知道,
我前面都已经说过了,
我都没怎么接触过Hibernate(超级呆菜鸟),
对它很不了解,都是受大家的启发,然后自己再去搜索它的源码,
偶然发现的。我只是想知道,
大家一般的做法比我的想法好在什么地方啦。。不要那么介意嘛。我也看源码看得老眼昏花先So...个rry!!!大家把心得提供出来嘛,
让初学者少走些弯路也好嘛。to: totodo(土豆仙) ,
你不要藏私,我知道你有很多绝招的。