/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.core.persistence;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.hibernate.HibernateException;
/**
* @author Jon.King 2006-4-7
*
* Query生成器
*
* <br>示例:
* <br> Object[] tableInfo0 = new Object[] {"OperEnterprise", "oe", "oe.eId = o.eId and oe.id.appId = ? ", new Object[] { appGd} };
<br> Object[] tableInfo1 = new Object[] {"Budget", "b", "b.budgetType = 1", null };
<br> Object[] tablesInfo = new Object[] {tableInfo0, tableInfo1};
<br> HQLQueryGenerator hq = new HQLQueryGenerator(condition);
<br> hq.add("o", "Plan o");
<br> hq.setOthers(" order by o.enterpriseId, o.budgetId");
<br> Query query = hq.getQuery(getSession(), tablesInfo);
<br>生成的HQL语句为:select o
<br> from Plan o, Budget b, OperEnterprise oe
<br> where oe.eId = o.eId and oe.id.appId = ? and b.budgetType = 1
<br> order by o.enterpriseId, o.budgetId
*/
public class HQLQueryGenerator {
private List<String> selects = new ArrayList<String>(); //格式为字符串 如:o.id
private List<String> froms = new ArrayList<String>(); //格式为一个数组 {表明(实体名),别名} {"Plan" ,"p"}
private List<String> wheres = new ArrayList<String>(); //格式为字符串 如: "o.id <= :?"
private List<Object> conditionValue = new ArrayList<Object>(); //格式为一个数组 {名字,值}
private String others = ""; //用于设置其他的,如order by等
private QueryCondition condition = null;
public HQLQueryGenerator(){
}
public HQLQueryGenerator(QueryCondition qyCondition){
this.condition = qyCondition;
}
private class SelectPart{
private StringBuffer sb = new StringBuffer();
public SelectPart(){
for(Iterator<String> it = selects.iterator();it.hasNext();){
if(sb.length() > 0){
sb.append(", ");
}
sb.append((String)it.next());
}
}
public String toString(){
if(sb.length() == 0){
return "";
}
return "select " + sb.toString();
}
}
private class FromPart{
private StringBuffer sb = new StringBuffer();
public FromPart(){
for(Iterator<String> it = froms.iterator();it.hasNext();){
if(sb.length() > 0){
sb.append(", ");
}
sb.append(it.next());
}
}
public String toString(){
return " from " + sb.toString();
}
}
private class WherePart{
private StringBuffer sb = new StringBuffer();
public WherePart(){
for(Iterator<String> it = wheres.iterator();it.hasNext();){
if(sb.length() > 0){
sb.append(" and ");
}
sb.append((String)it.next());
}
if(condition != null){
if(sb.length() > 0){
sb.append(" and ");
}
sb.append(condition.genHQLCondition());
}
}
public String toString(){
if(sb.length() == 0){
return "";
}
return " where " + sb.toString() + " ";
}
}
/**
* 设置参数值到Query对象中
*
* @param query
* @param session
* @param ht
* @param tablesInfo
* @return
* @throws HibernateException
*/
public Query getQuery(EntityManager em) throws HibernateException{
return getQuery(em, null);
}
public Query getQuery(EntityManager em, Object[] tablesInfo) throws HibernateException{
String hql = genHql(tablesInfo);
Query query = em.createQuery(hql);
for(int i = 0; i < conditionValue.size(); i++){
query.setParameter(i, conditionValue.get(i));
}
if(condition != null){
condition.genQueryCondition(query);
}
return query;
}
/**
* 添加查询表table,查询条件conditionStr,和参数值 Object[] params
* @param table
* @param conditionStr
* @param params
*/
private void add(String table, String conditionStr, Object[] params){
if(table != null){
froms.add(table);
}
if(conditionStr != null){
wheres.add(conditionStr);
}
if(params != null){
for(int i = 0; i < params.length; i++){
if(params[i] != null){
conditionValue.add(params[i]);
}
}
}
}
/**
* 添加查询表table,和查询列selectStr
* @param selectStr
* @param table
*/
public void add(String selectStr, String table){
if(selectStr != null){
selects.add(selectStr);
}
if(table != null){
froms.add(table);
}
}
public void add(String selectStr){
add(selectStr, null);
}
public void remove(String selectStr, String table){
selects.remove(selectStr);
froms.remove(table);
}
/**
* 添加其他的条件,例如order by
* @param others
*/
public void setOthers(String others){
if(others != null){
this.others = others;
}
}
/**
* 生成hql语句
* @return
*/
private String genHql(Object[] tablesInfo){
if(tablesInfo != null){
for(int i = 0; i < tablesInfo.length; i++){
Object[] tableInfo = (Object[])tablesInfo[i];
add((String)tableInfo[0] + " " + (String)tableInfo[1], (String)tableInfo[2], (Object[])tableInfo[3]);
}
}
return new SelectPart().toString() + new FromPart() + new WherePart() + this.others;
}
}