1 package org.hibernate.criterion; 3 4 import org.hibernate.Criteria; 5 import org.hibernate.EntityMode; 6 import org.hibernate.HibernateException; 7 import org.hibernate.engine.QueryParameters; 8 import org.hibernate.engine.SessionFactoryImplementor; 9 import org.hibernate.engine.SessionImplementor; 10 import org.hibernate.engine.TypedValue; 11 import org.hibernate.impl.CriteriaImpl; 12 import org.hibernate.loader.criteria.CriteriaQueryTranslator; 13 import org.hibernate.persister.entity.OuterJoinLoadable; 14 import org.hibernate.sql.Select; 15 import org.hibernate.type.Type; 16 17 20 public abstract class SubqueryExpression implements Criterion { 21 22 private CriteriaImpl criteriaImpl; 23 private String quantifier; 24 private String op; 25 private QueryParameters params; 26 private Type[] types; 27 28 protected Type[] getTypes() { 29 return types; 30 } 31 32 protected SubqueryExpression(String op, String quantifier, DetachedCriteria dc) { 33 this.criteriaImpl = dc.getCriteriaImpl(); 34 this.quantifier = quantifier; 35 this.op = op; 36 } 37 38 protected abstract String toLeftSqlString(Criteria criteria, CriteriaQuery outerQuery); 39 40 public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) 41 throws HibernateException { 42 43 final SessionImplementor session = ( (CriteriaImpl) criteria ).getSession(); final SessionFactoryImplementor factory = session.getFactory(); 45 46 final OuterJoinLoadable persister = (OuterJoinLoadable) factory.getEntityPersister( criteriaImpl.getEntityOrClassName() ); 47 CriteriaQueryTranslator innerQuery = new CriteriaQueryTranslator( 48 factory, 49 criteriaImpl, 50 criteriaImpl.getEntityOrClassName(), criteriaQuery.generateSQLAlias(), 52 criteriaQuery 53 ); 54 55 params = innerQuery.getQueryParameters(); types = innerQuery.getProjectedTypes(); 57 58 60 String sql = new Select( factory.getDialect() ) 61 .setWhereClause( innerQuery.getWhereCondition() ) 62 .setGroupByClause( innerQuery.getGroupBy() ) 63 .setSelectClause( innerQuery.getSelect() ) 64 .setFromClause( 65 persister.fromTableFragment( innerQuery.getRootSQLALias() ) + 66 persister.fromJoinFragment( innerQuery.getRootSQLALias(), true, false ) 67 ) 68 .toStatementString(); 69 70 final StringBuffer buf = new StringBuffer () 71 .append( toLeftSqlString(criteria, criteriaQuery) ); 72 if (op!=null) buf.append(' ').append(op).append(' '); 73 if (quantifier!=null) buf.append(quantifier).append(' '); 74 return buf.append('(').append(sql).append(')') 75 .toString(); 76 } 77 78 public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) 79 throws HibernateException { 80 Type[] types = params.getPositionalParameterTypes(); 81 Object [] values = params.getPositionalParameterValues(); 82 TypedValue[] tv = new TypedValue[types.length]; 83 for ( int i=0; i<types.length; i++ ) { 84 tv[i] = new TypedValue( types[i], values[i], EntityMode.POJO ); 85 } 86 return tv; 87 } 88 89 } 90 | Popular Tags |