Hibernate version:
3.2.1
Mapping documents:
Code:
<hibernate-mapping>
<class
name="model.AuditGroup"
table="nm_audit_group">
<id
name="id"
column="id"
type="java.lang.Long">
<generator class="sequence">
<param name="sequence">nm_audit_group_sequence</param>
</generator>
</id>
<property
name="date"
type="java.util.Date"
update="true"
insert="true"
column="date"
not-null="true"
/>
<set
name="audits"
lazy="true"
cascade="none"
sort="unsorted">
<key column="audit_group_id"/>
<one-to-many class="model.Audit"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class
name="model.Audit"
table="nm_audit">
<id
name="id"
column="id"
type="java.lang.Long">
<generator class="sequence">
<param name="sequence">nm_audit_sequence</param>
</generator>
</id>
<many-to-one
name="auditGroup"
class="model.AuditGroup"
cascade="none"
outer-join="auto"
update="true"
insert="true"
column="audit_group_id"
/>
<joined-subclass
name="model.Record"
table="nm_record">
<key column="audit_id"/>
<many-to-one
name="name"
class="model.RecordName"
cascade="all"
outer-join="auto"
update="true"
insert="true"
column="record_name_id"
/>
</joined-subclass>
<joined-subclass
name="model.UserAudit"
table="nm_user_audit">
<key column="audit_id"/>
<many-to-one
name="user"
class="model.User"
cascade="none"
outer-join="auto"
update="true"
insert="true"
column="user_id"
not-null="true"
/>
</joined-subclass>
<joined-subclass
name="model.RecordAudit"
table="nm_record_audit">
<key column="audit_id"/>
<many-to-one
name="record"
class="model.Record"
cascade="none"
outer-join="auto"
update="true"
insert="true"
column="record_id"
not-null="true"
/>
<joined-subclass
name="model.RecordName"
table="nm_record_name">
<key column="record_audit_id"/>
<property
name="name"
type="java.lang.String"
update="true"
insert="true"
column="name"
not-null="true"
/>
</joined-subclass>
</joined-subclass>
</class>
</hibernate-mapping>
What I am trying to do is use the Criteria API to retrieve all the AuditGroup objects that hava a collection of Audit objects which contain at least one RecordAudit object for a given Record id.
In SQL it looks like this:
Code:
select * from nm_audit_group as ag
inner join nm_audit as a on a.audit_group_id=ag.id
inner join nm_record_audit as ra on ra.audit_id=a.id
where ra.record_id=3;
Which very nicely can be done in a single select query.
The closest I was able to come with the Criteria API is:
Code:
DetachedCriteria dc=DetachedCriteria.forClass(AuditGroup.class);
dc=dc.createCriteria("audits");
dc.add(Restrictions.eq("class",RecordAudit.class));
dc.add(Restrictions.eq("record.id",_recordId));
return(getHibernateTemplate().findByCriteria(dc));
Which doesn't actually work.
I would really like to find a way to create the above SQL statement using the Criteria API. It seems like this should be possible.
*** update
I managed get the query I wanted working using HQL. The following two queries will return all the objects I wanted:
Code:
select distinct ag from AuditGroup ag, RecordAudit ra where ra.auditGroup=ag and ra.record.id=3
Code:
select distinct ag from RecordAudit ra inner join ra.auditGroup ag where ra.record.id=3