【发布时间】:2011-08-20 03:32:56
【问题描述】:
我使用 Hibernate 并且特别喜欢 Criteria api 来组合请求谓词,但在某些情况下无法使用它,因此我必须执行 HQL / SQL。
我不喜欢 HQL / SQL 查询构建主要是因为,除了不是 OO 之外,很难像我们可以使用 Criteria 那样使用谓词组合。 我不喜欢构建完整查询字符串、构建该查询然后添加所有查询参数的方法。
这里有人知道允许在 Hibernate/JPA 中简化 HQL/SQL 查询的编写和可重用性的工具吗?
实际上,我创建了一个小类,允许我同时构建查询部分和参数部分。我想它可能不会响应任何人的情况,但它仍然适用于我的简单用例:我主要在 where 子句中使用 AND 和 OR 组合谓词。
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
/**
* This permits to append to query step by step and give a better lisibility to some queries
* Works with hql and sql
*
* @author Sebastien Lorber (<i>lorber.sebastien@gmail.com</i>)
*/
public class AppendableQuery {
private Map<String,Object> parameters;
private Map<String,Collection<? extends Object>> parametersLists;
private StringBuilder queryBuilder;
/**
* Creates a new empty query
*/
public AppendableQuery() {
parameters = new HashMap<String, Object>();
parametersLists = new HashMap<String, Collection<? extends Object>>();
queryBuilder = new StringBuilder();
}
/**
* Append to the query
* @param querySubstring
*/
public AppendableQuery append(String querySubstring) {
queryBuilder.append(querySubstring);
return this;
}
/**
* Set a parameter to the query
* @param paramKey
* @param paramValue
*/
public AppendableQuery setParameter(String paramKey,Object paramValue) {
parameters.put(paramKey, paramValue);
return this;
}
/**
* Set a parameter list to the query
* @param paramKey
* @param paramValue
* @return
*/
public AppendableQuery setParameterList(String paramKey,Collection<? extends Object> paramValue) {
parametersLists.put(paramKey, paramValue);
return this;
}
/**
* Gets an HQL query based on what you filled
* @param hibernateSession
* @return SQL query
*/
public Query getHQLQuery(Session hibernateSession) {
Query query = hibernateSession.createQuery(queryBuilder.toString());
for ( Map.Entry<String, Object> entry : parameters.entrySet() ) {
query.setParameter(entry.getKey(), entry.getValue());
}
for ( Map.Entry<String, Collection<? extends Object>> entry : parametersLists.entrySet() ) {
query.setParameterList(entry.getKey(), entry.getValue());
}
return query;
}
/**
* Gets an SQL query based on what you filled
* @param hibernateSession
* @return SQL query
*/
public SQLQuery getSQLQuery(Session hibernateSession) {
SQLQuery query = hibernateSession.createSQLQuery(queryBuilder.toString());
for ( Map.Entry<String, Object> entry : parameters.entrySet() ) {
query.setParameter(entry.getKey(), entry.getValue());
}
for ( Map.Entry<String, Collection<? extends Object>> entry : parametersLists.entrySet() ) {
query.setParameterList(entry.getKey(), entry.getValue());
}
return query;
}
}
你怎么看这样的把戏?你知道支持的社区工具几乎可以做这种事情吗?
【问题讨论】: