Hi, I was trying to store query results in the global cache service using a key based on the hashcode of the Criteria object and I found out that hashcodes for equal Criteria are not equal. This breaks the rules because the Java spec says something like this:
"If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result" This problem occurs because the Criteria.Criterion inner class defines an equals() method without defining a matching hashCode() method. I played around a bit and came up with this implementation: /** * Returns a hash code value for the object. */ public int hashCode() { int h = value.hashCode() + comparison.hashCode(); if (table != null) h += table.hashCode(); if (column != null) h += column.hashCode(); if (and != null) h += and.hashCode(); if (or != null) h += or.hashCode(); return h; } I'm no hashCode expert but it works consistently with my tests. The patch for the above code (in jakarta-turbine-2) is attached below, Age Index: src/java/org/apache/turbine/util/db/Criteria.java =================================================================== RCS file: /home/cvspublic/jakarta-turbine-2/src/java/org/apache/turbine/util/db/Criteria.java,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 Criteria.java --- src/java/org/apache/turbine/util/db/Criteria.java 2001/08/16 05:09:46 1.1.1.1 +++ src/java/org/apache/turbine/util/db/Criteria.java 2001/09/27 14:11:14 @@ -3650,6 +3650,28 @@ return isEquiv; } + /** + * Returns a hash code value for the object. + */ + public int hashCode() + { + int h = value.hashCode() + comparison.hashCode(); + + if (table != null) + h += table.hashCode(); + + if (column != null) + h += column.hashCode(); + + if (and != null) + h += and.hashCode(); + + if (or != null) + h += or.hashCode(); + + return h; + } + public String[] getAllTables() { StringStackBuffer tables = new StringStackBuffer(); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]