From aa710c666835b791d5a2c660314bc91679f7d9c4 Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Mon, 1 Jun 2009 18:54:44 +0000 Subject: [PATCH] HHH-3383 - QueryKey is storing references to entities instead of identifiers git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@16652 1b8cb986-b30d-0410-93ca-fae66ebed9b2 --- .../java/org/hibernate/cache/QueryKey.java | 184 ++++++++++++++---- .../java/org/hibernate/loader/Loader.java | 14 +- .../org/hibernate/util/CollectionHelper.java | 4 + .../org/hibernate/cache/QueryKeyTest.java | 39 ++-- 4 files changed, 173 insertions(+), 68 deletions(-) diff --git a/core/src/main/java/org/hibernate/cache/QueryKey.java b/core/src/main/java/org/hibernate/cache/QueryKey.java index 8175aebf61..af1014bd24 100644 --- a/core/src/main/java/org/hibernate/cache/QueryKey.java +++ b/core/src/main/java/org/hibernate/cache/QueryKey.java @@ -28,13 +28,17 @@ import java.io.Serializable; import java.io.IOException; import java.util.Map; import java.util.Set; +import java.util.Iterator; import org.hibernate.EntityMode; import org.hibernate.engine.QueryParameters; import org.hibernate.engine.RowSelection; +import org.hibernate.engine.SessionImplementor; +import org.hibernate.engine.TypedValue; import org.hibernate.transform.ResultTransformer; import org.hibernate.type.Type; import org.hibernate.util.EqualsHelper; +import org.hibernate.util.CollectionHelper; /** * A key that identifies a particular query with bound parameter values @@ -59,12 +63,41 @@ public class QueryKey implements Serializable { */ private transient int hashCode; - public QueryKey(String queryString, QueryParameters queryParameters, Set filters, EntityMode entityMode) { - this.sqlQueryString = queryString; - this.types = queryParameters.getPositionalParameterTypes(); - this.values = queryParameters.getPositionalParameterValues(); - RowSelection selection = queryParameters.getRowSelection(); - if (selection!=null) { + public static QueryKey generateQueryKey( + String queryString, + QueryParameters queryParameters, + Set filters, + SessionImplementor session) { + // disassemble positional parameters + final int positionalParameterCount = queryParameters.getPositionalParameterTypes().length; + final Type[] types = new Type[positionalParameterCount]; + final Object[] values = new Object[positionalParameterCount]; + for ( int i = 0; i < positionalParameterCount; i++ ) { + types[i] = queryParameters.getPositionalParameterTypes()[i]; + values[i] = types[i].disassemble( queryParameters.getPositionalParameterValues()[i], session, null ); + } + + // disassemble named parameters + Map namedParameters = CollectionHelper.mapOfSize( queryParameters.getNamedParameters().size() ); + Iterator itr = queryParameters.getNamedParameters().entrySet().iterator(); + while ( itr.hasNext() ) { + final Map.Entry namedParameterEntry = ( Map.Entry ) itr.next(); + final TypedValue original = ( TypedValue ) namedParameterEntry.getValue(); + namedParameters.put( + namedParameterEntry.getKey(), + new TypedValue( + original.getType(), + original.getType().disassemble( original.getValue(), session, null ), + session.getEntityMode() + ) + ); + } + + // decode row selection... + final RowSelection selection = queryParameters.getRowSelection(); + final Integer firstRow; + final Integer maxRows; + if ( selection != null ) { firstRow = selection.getFirstRow(); maxRows = selection.getMaxRows(); } @@ -72,13 +105,62 @@ public class QueryKey implements Serializable { firstRow = null; maxRows = null; } - this.namedParameters = queryParameters.getNamedParameters(); + + return new QueryKey( + queryString, + types, + values, + namedParameters, + firstRow, + maxRows, + filters, + session.getEntityMode(), + queryParameters.getResultTransformer() + ); + } + + /*package*/ QueryKey( + String sqlQueryString, + Type[] types, + Object[] values, + Map namedParameters, + Integer firstRow, + Integer maxRows, + Set filters, + EntityMode entityMode, + ResultTransformer customTransformer) { + this.sqlQueryString = sqlQueryString; + this.types = types; + this.values = values; + this.namedParameters = namedParameters; + this.firstRow = firstRow; + this.maxRows = maxRows; this.entityMode = entityMode; this.filters = filters; - this.customTransformer = queryParameters.getResultTransformer(); + this.customTransformer = customTransformer; this.hashCode = generateHashCode(); } +// public QueryKey(String queryString, QueryParameters queryParameters, Set filters, EntityMode entityMode) { +// this.sqlQueryString = queryString; +// this.types = queryParameters.getPositionalParameterTypes(); +// this.values = queryParameters.getPositionalParameterValues(); +// RowSelection selection = queryParameters.getRowSelection(); +// if (selection!=null) { +// firstRow = selection.getFirstRow(); +// maxRows = selection.getMaxRows(); +// } +// else { +// firstRow = null; +// maxRows = null; +// } +// this.namedParameters = queryParameters.getNamedParameters(); +// this.entityMode = entityMode; +// this.filters = filters; +// this.customTransformer = queryParameters.getResultTransformer(); +// this.hashCode = generateHashCode(); +// } + private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); this.hashCode = generateHashCode(); @@ -99,25 +181,43 @@ public class QueryKey implements Serializable { } public boolean equals(Object other) { - if (!(other instanceof QueryKey)) return false; - QueryKey that = (QueryKey) other; - if ( !sqlQueryString.equals(that.sqlQueryString) ) return false; - if ( !EqualsHelper.equals(firstRow, that.firstRow) || !EqualsHelper.equals(maxRows, that.maxRows) ) return false; - if ( !EqualsHelper.equals(customTransformer, that.customTransformer) ) return false; - if (types==null) { - if (that.types!=null) return false; + if ( !( other instanceof QueryKey ) ) { + return false; } - else { - if (that.types==null) return false; - if ( types.length!=that.types.length ) return false; - for ( int i=0; i