KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hibernate > criterion > SubqueryExpression


1 //$Id: SubqueryExpression.java,v 1.8 2005/07/04 02:40:28 oneovthafew Exp $
2
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 /**
18  * @author Gavin King
19  */

20 public abstract class SubqueryExpression implements Criterion {
21     
22     private CriteriaImpl criteriaImpl;
23     private String JavaDoc quantifier;
24     private String JavaDoc op;
25     private QueryParameters params;
26     private Type[] types;
27     
28     protected Type[] getTypes() {
29         return types;
30     }
31     
32     protected SubqueryExpression(String JavaDoc op, String JavaDoc quantifier, DetachedCriteria dc) {
33         this.criteriaImpl = dc.getCriteriaImpl();
34         this.quantifier = quantifier;
35         this.op = op;
36     }
37     
38     protected abstract String JavaDoc toLeftSqlString(Criteria criteria, CriteriaQuery outerQuery);
39
40     public String JavaDoc toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
41     throws HibernateException {
42         
43         final SessionImplementor session = ( (CriteriaImpl) criteria ).getSession(); //ugly!
44
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(), //implicit polymorphism not supported (would need a union)
51
criteriaQuery.generateSQLAlias(),
52                 criteriaQuery
53             );
54         
55         params = innerQuery.getQueryParameters(); //TODO: bad lifecycle....
56
types = innerQuery.getProjectedTypes();
57         
58         //String filter = persister.filterFragment( innerQuery.getRootSQLALias(), session.getEnabledFilters() );
59

60         String JavaDoc 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 JavaDoc buf = new StringBuffer JavaDoc()
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 JavaDoc[] 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