Re: QueryByCriteria not taking all non null fields in account with inheritance object
Piet Molenaar <[email protected]>
| Newsgroups | gmane.comp.jakarta.ojb.user |
|---|---|
| Message-ID | <[email protected]> |
Thanks a lot for your fast reaction!
The workaround you proposed (I'd implemented something like that)
works for my version of ojb (1.04).
And I'm looking forward to the next release!
Kind regards,
Piet
At 06:51 PM 1/24/2007, you wrote:
>Hi Piet,
>
>Piet Molenaar wrote:
>>Hi All,
>>I do not know whether this is desired behavior but when I use
>>QueryByCriteria with an object that maps an inheritance hierarchy,
>>only the fields specific for that object are queried (the javadocs state:
>>Builds a Query based on anObject all non null values are used as
>>EqualToCriteria).
>>Consider the mapping below; there are specific detectionmethods
>>(rnadetection, dnadetection) inheriting from a generic detectionmethod.
>>This generic detectionmethod has a geneexptype; the specific
>>rnadetection has a rnadetectiontype
>>When I now query the following
>> RnaDetection detection = new RnaDetection();
>> detection.setDetectiontype("Rna level");
>> detection.setRnadetectiontype("Northern Blot");
>> detection.setGeneexptype("Mutant on");
>> QueryByCriteria q = new QueryByCriteria(evidence);
>>q.toString() now gives:
>>QueryByCriteria from class amcplugin.data.persistency.RnaDetection
>>where [rnadetectiontype = Northern Blot]
>>This finds the wrong object as the fields geneexptype and
>>detectiontype are not taken into consideration....
>>See below for descriptors and classes; maybe there's something
>>wrong in the way I implement these using interfaces?
>
>Seems your mapping is correct. You are using the real implementation
>classes in mapping and source.
>
>>Or is overriding equals, hashcode not allowed (till now I did not
>>experience problems with that)
>
>This shouldn't be a problem.
>
>Seems that "query by example" only extract the fields of the current
>class all inherited fields (using 'table per subclass') seem to be ignored.
>
>I set up a similar test with latest from SVN (OJB_1_0_RELEASE
>branch) using class Manager--->Executive--->Employee (with
>inheritance, base class is Employee). The test fail when set
>inherited fields in the example object.
>Checked in a fix some minutes ago (JIRA: OJB-128).
>
>Using the Criteria-API the test pass.
>The Criteria looks like these:
>String name = "testComplexQuery_" + timestamp;
>Criteria crit = new Criteria()
> .addLike("executives.name", "%" + name)
> .addEqualTo("name", "manager_" + name)
> .addIsNull("department")
> .addIsNull("manager")
> .addIsNull("address");
>Query q = QueryFactory.newQuery(Manager.class, crit);
>
>The field 'executives' is defined in Manager class, fields
>'department' and 'manager' are declared in Executive, field 'name'
>and 'address' are declared in Employee.
>Think this is similar to your test and could be a workaround. All
>fields are be included in the the generated query.
>
>The Criteria.toString log:
>crit: [executives.name LIKE %testComplexQuery_1169638422671, name =
>manager_testComplexQuery_1169638422671, department IS NULL , manager
>IS NULL , address IS NULL ]
>
>And the generated SQL looks like:
>
>SELECT
>A0.OBJ_ID,A0.OBJ_ID_2,A0.FK_CONSORTIUM,A1.OBJ_ID,A1.OBJ_ID_2,A1.DEPARTMENT,A1.MANAGER_ID,A1.MANAGER_ID_2,A2.OBJ_ID,A2.OBJ_ID_2,A2.NAME,A2.FK_ADDRESS,A3.OBJ_ID,A3.OBJ_ID_2,A3.SHARE_,CASE
>WHEN A3.OBJ_ID IS NOT NULL AND A3.OBJ_ID_2 IS NOT NULL THEN
>'org.apache.ojb.broker.InheritanceMultipleTableTest$Shareholder'
>ELSE 'org.apache.ojb.broker.InheritanceMultipleTableTest$Manager'
>END AS OJB_CLAZZ FROM INH_MANAGER A0 INNER JOIN INH_EXECUTIVE A1 ON
>A0.OBJ_ID=A1.OBJ_ID AND A0.OBJ_ID_2=A1.OBJ_ID_2 INNER JOIN
>INH_EMPLOYEE A2 ON A1.OBJ_ID=A2.OBJ_ID AND A1.OBJ_ID_2=A2.OBJ_ID_2
>LEFT OUTER JOIN INH_SHAREHOLDER A3 ON A0.OBJ_ID=A3.OBJ_ID AND
>A0.OBJ_ID_2=A3.OBJ_ID_2 INNER JOIN INH_EXECUTIVE A4 ON
>A0.OBJ_ID=A4.MANAGER_ID AND A0.OBJ_ID_2=A4.MANAGER_ID_2 INNER JOIN
>INH_EMPLOYEE A5 ON A4.OBJ_ID=A5.OBJ_ID AND A4.OBJ_ID_2=A5.OBJ_ID_2
>WHERE ((((A2.NAME LIKE '%testComplexQuery_1169638422671') AND
>A2.NAME = 'manager_testComplexQuery_1169638422671') AND
>A1.DEPARTMENT IS NULL ) AND A1.MANAGER_ID IS NULL ) AND A2.FK_ADDRESS IS NULL
>
>If this doesn't work with your release, please try latest source
>from SVN - if possible (source is stable). We plan to release OJB
>1.0.5 by the end of this month (wait for RC1 of DdlUtils project to
>include this jar).
>
>regards,
>Armin
>
>>Thanks in advance!
>>Piet
>>
>>
>> <class-descriptor
>> class="amcplugin.data.persistency.DetectionMethod"
>> table="DETECTION_METHOD"
>> >
>> <field-descriptor id="1"
>> name="methodid"
>> column="METHOD_ID"
>> jdbc-type="INTEGER"
>> primarykey="true"
>> autoincrement="true"
>> />
>> <field-descriptor id="2"
>> name="detectiontype"
>> column="DETECTION_TYPE"
>> jdbc-type="VARCHAR"
>> />
>> <field-descriptor id="3"
>> name="geneexptype"
>> column="GENE_EXP_TYPE"
>> jdbc-type="VARCHAR"
>> />
>> </class-descriptor>
>> <!-- RnaDetection describes the method of detection on rna level -->
>> <class-descriptor
>> class="amcplugin.data.persistency.RnaDetection"
>> table="RNA_DETECTION"
>> >
>> <field-descriptor id="1"
>> name="methodid"
>> column="METHOD_ID"
>> jdbc-type="INTEGER"
>> primarykey="true"
>> />
>> <field-descriptor id="2"
>> name="rnadetectiontype"
>> column="RNA_DETECTION_TYPE"
>> jdbc-type="VARCHAR"
>> />
>> <reference-descriptor name="super"
>> class-ref="amcplugin.data.persistency.DetectionMethod"
>> >
>> <foreignkey field-ref="methodid"/>
>> </reference-descriptor>
>> </class-descriptor>
>>
>>public class DetectionMethod implements DetectionMethodInterface
>>{
>> private volatile int hashCode = 0;
>> public static String METHOD_ID = "methodid";
>> public static String GENE_EXP_TYPE = "geneexptype";
>> public static String DETECTION_TYPE = "detectiontype";
>> protected Integer methodid;
>> protected String geneexptype;
>> protected String detectiontype;
>> public DetectionMethod()
>> {
>> this.setDetectiontype("Not specified");
>> this.setGeneexptype("Not specified");
>> }
>> public String getGeneexptype()
>> {
>> return geneexptype;
>> }
>> public void setGeneexptype(String geneexptype)
>> {
>> this.geneexptype = geneexptype;
>> }
>> public String getDetectiontype()
>> {
>> return detectiontype;
>> }
>> public void setDetectiontype(String detectionlevel)
>> {
>> this.detectiontype = detectionlevel;
>> }
>> /**
>> * @return Returns the methodid.
>> */
>> public Integer getMethodid()
>> {
>> return methodid;
>> }
>> public void setMethodid(Integer methodid)
>> {
>> this.methodid = methodid;
>> }
>> public String toString()
>> {
>> StringBuffer sb = new StringBuffer();
>> sb.append(this.getDetectiontype());
>> return sb.toString();
>> }
>> /**
>> * Override to compare dataobjects
>> *
>> * @return
>> */
>> public boolean equals(Object o)
>> {
>> if (o == this)
>> return true;
>> if (o != null && o.getClass().equals(this.getClass()))
>> {
>> DetectionMethod other = (DetectionMethod) o;
>> return ((this.detectiontype == other.detectiontype) ||
>> (this.detectiontype != null)
>> && this.detectiontype.equals(other.detectiontype))
>> && ((this.geneexptype == other.geneexptype) ||
>> (this.geneexptype != null)
>> && this.geneexptype.equals(other.geneexptype));
>> }
>> else
>> return false;
>> }
>> /**
>> * When equals overridden than hashCode also
>> */
>> public int hashCode()
>> {
>> if (hashCode == 0)
>> {
>> int dl, ge;
>> if (this.detectiontype == null)
>> dl = 0;
>> else
>> dl = this.detectiontype.hashCode();
>> if (this.geneexptype == null)
>> ge = 0;
>> else
>> ge = this.geneexptype.hashCode();
>> int result = 17;
>> result = 37 * result + dl;
>> result = 37 * result + ge;
>> hashCode = result;
>> }
>> return hashCode;
>> }
>>}
>>
>>public interface DetectionMethodInterface {
>> public String getDetectiontype();
>> public void setDetectiontype(String detectionlevel);
>> public String getGeneexptype();
>> public void setGeneexptype(String hostproperties);
>> public Integer getMethodid();
>> public void setMethodid(Integer methodid);
>>}
>>public class RnaDetection extends DetectionMethod implements
>>RnaDetectionInterface
>>{
>> public static String RNA_DETECTION_TYPE = "rnadetectiontype";
>> private volatile int hashCode = 0;
>> protected String rnadetectiontype;
>> public RnaDetection()
>> {
>> super();
>> super.setDetectiontype("Rna level");
>> this.setRnadetectiontype("Unspecified");
>> }
>> public String getRnadetectiontype()
>> {
>> return rnadetectiontype;
>> }
>> public void setRnadetectiontype(String rnadetectiontype)
>> {
>> this.rnadetectiontype = rnadetectiontype;
>> }
>> public String toString()
>> {
>> StringBuffer sb = new StringBuffer();
>> sb.append(getRnadetectiontype());
>> sb.append("::");
>> sb.append(super.toString());
>> return sb.toString();
>> }
>> /**
>> * Override to compare dataobjects
>> *
>> * @return
>> */
>> public boolean equals(Object o)
>> {
>> if (o == this)
>> return true;
>> if (o != null && o.getClass().equals(this.getClass()))
>> {
>> RnaDetection other = (RnaDetection) o;
>> return ((this.detectiontype == other.detectiontype) ||
>> (this.detectiontype != null)
>> && this.detectiontype.equals(other.detectiontype))
>> && ((this.geneexptype == other.geneexptype) ||
>> (this.geneexptype != null)
>> && this.geneexptype.equals(other.geneexptype))
>> && ((this.rnadetectiontype ==
>> other.rnadetectiontype) || (this.rnadetectiontype != null)
>> &&
>> this.rnadetectiontype.equals(other.rnadetectiontype));
>> }
>> else
>> return false;
>> }
>> /**
>> * When equals overridden than hashCode also
>> */
>> public int hashCode()
>> {
>> if (hashCode == 0)
>> {
>> int dl, ge, rdt;
>> if (this.detectiontype == null)
>> dl = 0;
>> else
>> dl = this.detectiontype.hashCode();
>> if (this.geneexptype == null)
>> ge = 0;
>> else
>> ge = this.geneexptype.hashCode();
>> if (this.rnadetectiontype == null)
>> rdt = 0;
>> else
>> rdt = this.rnadetectiontype.hashCode();
>> int result = 17;
>> result = 37 * result + dl;
>> result = 37 * result + ge;
>> result = 37 * result + rdt;
>> hashCode = result;
>> }
>> return hashCode;
>> }
>>public interface RnaDetectionInterface extends DetectionMethodInterface {
>> public String getRnadetectiontype();
>> public void setRnadetectiontype(String rnadetectiontype);
>>}
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: [email protected]
>>For additional commands, e-mail: [email protected]
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [email protected]
>For additional commands, e-mail: [email protected]
>