From: <one...@us...> - 2003-03-04 10:53:51
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/loader In directory sc8-pr-cvs1:/tmp/cvs-serv2690/sf/hibernate/loader Modified Files: EntityLoader.java Loader.java Added Files: AbstractEntityLoader.java SearchLoader.java Log Message: made Query methods return this to allow chaining added experimental find(Class, Map) improved parsing of query imports, etc fixed a bug in PS handling --- NEW FILE: AbstractEntityLoader.java --- package net.sf.hibernate.loader; import java.util.List; import net.sf.hibernate.MappingException; import net.sf.hibernate.engine.SessionFactoryImplementor; import net.sf.hibernate.persister.Loadable; import net.sf.hibernate.sql.JoinFragment; import net.sf.hibernate.sql.Select; import net.sf.hibernate.util.StringHelper; public abstract class AbstractEntityLoader extends OuterJoinLoader { protected final Loadable persister; protected String alias; public AbstractEntityLoader(Loadable persister, SessionFactoryImplementor factory) { super( factory.getDialect() ); this.persister = persister; alias = alias( persister.getClassName(), 0 ); } protected void renderStatement(String condition, SessionFactoryImplementor factory) throws MappingException { List associations = walkTree(persister, alias, factory); int joins=associations.size(); suffixes = new String[joins+1]; for ( int i=0; i<=joins; i++ ) suffixes[i] = (joins==0) ? StringHelper.EMPTY_STRING : Integer.toString(i) + StringHelper.UNDERSCORE; JoinFragment ojf = outerJoins(associations); sql = new Select() .setSelectClause( ( joins==0 ? StringHelper.EMPTY_STRING : selectString(associations) + ", " ) + selectString( persister, alias, suffixes[joins] ) ) .setFromClause( persister.fromTableFragment(alias) + persister.fromJoinFragment(alias, true, true) ) .setWhereClause(condition) .setOuterJoins( ojf.toFromFragmentString(), ojf.toWhereFragmentString() + persister.whereJoinFragment(alias, true, true) ) .toStatementString(); classPersisters = new Loadable[joins+1]; for ( int i=0; i<joins; i++ ) classPersisters[i] = ( (OuterJoinableAssociation) associations.get(i) ).subpersister; classPersisters[joins] = persister; } } --- NEW FILE: SearchLoader.java --- package net.sf.hibernate.loader; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.List; import java.util.Map; import net.sf.hibernate.HibernateException; import net.sf.hibernate.MappingException; import net.sf.hibernate.engine.SessionFactoryImplementor; import net.sf.hibernate.engine.SessionImplementor; import net.sf.hibernate.persister.Loadable; import net.sf.hibernate.type.Type; public class SearchLoader extends AbstractEntityLoader { private String[] propertyNames; private int[] propertyIndexes; private Type[] propertyTypes; private SessionFactoryImplementor factory; public SearchLoader(Loadable persister, SessionFactoryImplementor factory, String[] propertyNames) throws MappingException { super(persister, factory); this.propertyNames=propertyNames; this.factory = factory; propertyIndexes = new int[propertyNames.length]; propertyTypes = new Type[propertyNames.length]; Type[] types = persister.getPropertyTypes(); String[] allPropertyNames = persister.getPropertyNames(); for ( int i=0; i<propertyNames.length; i++ ) { int prop=-1; for ( int k=0; k<allPropertyNames.length; k++ ) { if ( allPropertyNames[k].equals(propertyNames[i]) ) { prop=k; break; } } //TODO: not a MappingException if (prop==-1) throw new MappingException("property not found: " + propertyNames[i]); propertyIndexes[i] = prop; propertyTypes[i] = types[prop]; } renderStatement( getConditionString(), factory ); } protected String getConditionString() throws MappingException { StringBuffer buffer = new StringBuffer(); int count=0; for ( int i=0; i<propertyNames.length; i++ ) { //TODO: handle null values using IS NULL String[] columnNames = persister.getPropertyColumnNames(propertyIndexes[i]); int[] sqlTypes = propertyTypes[i].sqlTypes(factory); for ( int j=0; j<columnNames.length; j++ ) { if (0 < count++) buffer.append(" and "); String op = ( sqlTypes[j]==Types.VARCHAR ) ? " like ?" : "=?"; buffer.append(alias).append('.').append( columnNames[j] ).append(op); } } return buffer.toString(); } public List list(SessionImplementor session, Map propertyNameValues) throws HibernateException, SQLException { Object[] values = new Object[propertyNames.length]; for ( int i=0; i<propertyNames.length; i++ ) { values[i] = propertyNameValues.get( propertyNames[i] ); } return find(session, values, propertyTypes, true, null, null); } protected Object getResultColumnOrRow(Object[] row, ResultSet rs, SessionImplementor session) throws SQLException, HibernateException { return row[ row.length-1 ]; } } Index: EntityLoader.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/loader/EntityLoader.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** EntityLoader.java 23 Feb 2003 07:22:11 -0000 1.11 --- EntityLoader.java 4 Mar 2003 10:53:47 -0000 1.12 *************** *** 10,69 **** import net.sf.hibernate.engine.SessionFactoryImplementor; import net.sf.hibernate.engine.SessionImplementor; - import net.sf.hibernate.persister.ClassPersister; import net.sf.hibernate.persister.Loadable; import net.sf.hibernate.sql.ConditionFragment; - import net.sf.hibernate.sql.JoinFragment; - import net.sf.hibernate.sql.Select; import net.sf.hibernate.type.Type; - import net.sf.hibernate.util.StringHelper; /** * Load an entity using outerjoin fetching to fetch associated entities. */ ! public class EntityLoader extends OuterJoinLoader implements UniqueEntityLoader { private final Type[] idType; - private final ClassPersister persister; public EntityLoader(Loadable persister, SessionFactoryImplementor factory) throws MappingException { ! ! super( factory.getDialect() ); idType = new Type[] { persister.getIdentifierType() }; - this.persister = persister; - - String alias = alias( persister.getClassName(), 0 ); - - List associations = walkTree(persister, alias, factory); ! int joins=associations.size(); ! suffixes = new String[joins+1]; ! for ( int i=0; i<=joins; i++ ) suffixes[i] = (joins==0) ? StringHelper.EMPTY_STRING : Integer.toString(i) + StringHelper.UNDERSCORE; ! ! JoinFragment ojf = outerJoins(associations); ! sql = new Select() ! .setSelectClause( ! ( joins==0 ? StringHelper.EMPTY_STRING : selectString(associations) + ", " ) + ! selectString( persister, alias, suffixes[joins] ) ! ) ! .setFromClause( ! persister.fromTableFragment(alias) + ! persister.fromJoinFragment(alias, true, true) ! ) ! .setWhereClause( ! new ConditionFragment().setTableAlias(alias) ! .setCondition( persister.getIdentifierColumnNames(), "?" ) ! .toFragmentString() ! ) ! .setOuterJoins( ! ojf.toFromFragmentString(), ! ojf.toWhereFragmentString() + ! persister.whereJoinFragment(alias, true, true) ! ) ! .toStatementString(); ! classPersisters = new Loadable[joins+1]; ! for ( int i=0; i<joins; i++ ) classPersisters[i] = ( (OuterJoinableAssociation) associations.get(i) ).subpersister; ! classPersisters[joins] = persister; } --- 10,34 ---- import net.sf.hibernate.engine.SessionFactoryImplementor; import net.sf.hibernate.engine.SessionImplementor; import net.sf.hibernate.persister.Loadable; import net.sf.hibernate.sql.ConditionFragment; import net.sf.hibernate.type.Type; /** * Load an entity using outerjoin fetching to fetch associated entities. */ ! public class EntityLoader extends AbstractEntityLoader implements UniqueEntityLoader { private final Type[] idType; public EntityLoader(Loadable persister, SessionFactoryImplementor factory) throws MappingException { ! super(persister, factory); idType = new Type[] { persister.getIdentifierType() }; ! String condition = new ConditionFragment().setTableAlias(alias) ! .setCondition( persister.getIdentifierColumnNames(), "?" ) ! .toFragmentString(); ! renderStatement(condition, factory); } *************** *** 78,84 **** } else { ! throw new HibernateException( "More than one row with the given identifier was found: " + id + ", for class: " + persister.getClassName() ); } } } --- 43,55 ---- } else { ! throw new HibernateException( ! "More than one row with the given identifier was found: " + ! id + ! ", for class: " + ! persister.getClassName() ! ); } } + } Index: Loader.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/loader/Loader.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** Loader.java 23 Feb 2003 01:32:20 -0000 1.12 --- Loader.java 4 Mar 2003 10:53:47 -0000 1.13 *************** *** 169,173 **** } finally { ! session.getBatcher().closeQueryStatement(st); } } --- 169,173 ---- } finally { ! closePreparedStatement(st, selection, session); } } *************** *** 390,398 **** catch (SQLException sqle) { JDBCExceptionReporter.logExceptions(sqle); ! session.getBatcher().closeQueryStatement(st); throw sqle; } catch (HibernateException he) { ! session.getBatcher().closeQueryStatement(st); throw he; } --- 390,398 ---- catch (SQLException sqle) { JDBCExceptionReporter.logExceptions(sqle); ! closePreparedStatement(st, selection, session); throw sqle; } catch (HibernateException he) { ! closePreparedStatement(st, selection, session); throw he; } *************** *** 424,432 **** catch (SQLException sqle) { JDBCExceptionReporter.logExceptions(sqle); throw sqle; } catch (HibernateException he) { ! session.getBatcher().closeQueryStatement(st); throw he; } } --- 424,445 ---- catch (SQLException sqle) { JDBCExceptionReporter.logExceptions(sqle); + closePreparedStatement(st, selection, session); throw sqle; } catch (HibernateException he) { ! closePreparedStatement(st, selection, session); throw he; + } + } + + protected final void closePreparedStatement(PreparedStatement st, RowSelection selection, SessionImplementor session) throws SQLException, HibernateException { + try { + if (selection!=null) { + if (selection.getMaxRows()!=null) st.setMaxRows(0); + if (selection.getTimeout()!=null) st.setQueryTimeout(0); + } + } + finally { + session.getBatcher().closeQueryStatement(st); } } |