2012年3月29日星期四

Real-World Experiences With Hibernate

original link

写了两个hql查询参数设置辅助类,一个根据参数(?)位置(index)顺序方式,另一个用名称参数
顺序方式
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.type.Type;

@SuppressWarnings( { "unchecked", "unused" })
/**
 * hql查询参数设置包装类  用?顺序赋值的方式
 * @author jeff.yao
 * @date 2012-3-28
 * */
public class QueryParamWarper {
private final List<QueryParam> list = new ArrayList<QueryParam>(16);// 初始化长度
public QueryParamWarper() {
}

// 支持链式操作
public QueryParamWarper add(QueryParam e) {
list.add(e);
return this;
}
// 支持链式操作
public QueryParamWarper add(Object value, Type type) {
list.add(new QueryParam(value, type));
return this;
}
public List<QueryParam> getList() {
return list;
}
public Query setQuery(final Query query) {
for (int index = 0, length = list.size(); index < length; index++) {
QueryParam p = list.get(index);
Type type = p.getType();
query.setParameter(index, p.getValue(), type);
}
return query;
}
public static void main(String[] args) {
QueryParamWarper w = new QueryParamWarper();
for (int i = 0; i < 100; i++) {
w.getList().add(new QueryParam("string" + i, Hibernate.STRING));
}
}
}
class QueryParam {
/*
* http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/type/Type.html
* http://www.roseindia.net/hibernate/hibernate-types.shtml
*/
private Type type;
private Object value;
/**
* @param type Hibernate.Type
* @param value
*/
public QueryParam(Object value, Type type) {
super();
this.type = type;
this.value = value;
}
public Type getType() {
return type;
}
public Object getValue() {
return value;
}
}
名称参数



import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.hibernate.Query;
/**
 * hql查询参数设置辅助类 用命名参数赋值的方式
 * @author jeff.yao
 * @date 2012-3-28
 * */
public class QueryParamHelper {
private Map<String, Object> map = null;

public QueryParamHelper(int initialCapacity) {
map = new HashMap<String, Object>(initialCapacity <= 0 ? 16 : initialCapacity);
}

public QueryParamHelper(Map<String, Object> map) {
if (map != null) {
this.map = map;
}
}

public QueryParamHelper set(String name, Object value) {
map.put(name, value);
return this;
}

@SuppressWarnings("unchecked")
public Query setParameter(Query query) {
if (map != null) {
Set<String> keySet = map.keySet();
for (String name : keySet) {
Object value = map.get(name);
Class clazz = value.getClass();
if (Collection.class.isAssignableFrom(clazz)) {
query.setParameterList(name, (Collection) value);
} else if (clazz.isArray()) {
query.setParameterList(name, (Object[]) value);
} else if (clazz == Date.class) {// 日期用setTimestamp
query.setTimestamp(name, (Date) value);
} else {
query.setParameter(name, value);
}
}
}
return query;
}
}


没有评论:

发表评论