HHH-5580 - Using Criteria API in RevisionInfoQueryCreator

This commit is contained in:
Lukasz Antoniak 2011-05-15 00:46:54 +02:00
parent b36b095c3c
commit dd55a99b00
3 changed files with 25 additions and 51 deletions

View File

@ -307,9 +307,7 @@ public class RevisionInfoConfiguration {
return new RevisionInfoConfigurationResult(
revisionInfoGenerator, revisionInfoXmlMapping,
new RevisionInfoQueryCreator(revisionInfoEntityName, revisionInfoIdData.getName(),
revisionInfoTimestampData.getName(), isTimestampAsDate(),
globalCfg.isTrackEntitiesChangedInRevisionEnabled() ? modifiedEntityNamesData.getName()
: null),
revisionInfoTimestampData.getName(), isTimestampAsDate()),
generateRevisionInfoRelationMapping(),
new RevisionInfoNumberReader(revisionInfoClass, revisionInfoIdData), revisionInfoEntityName,
revisionInfoClass, revisionInfoTimestampData);

View File

@ -27,9 +27,9 @@ import static org.hibernate.envers.tools.ArgumentsTools.checkPositive;
import java.util.*;
import javax.persistence.NoResultException;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.NonUniqueResultException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.envers.ModifiedEntityNames;
@ -153,7 +153,7 @@ public class AuditReaderImpl implements AuditReaderImplementor {
checkPositive(revision, "Entity revision");
checkSession();
Query query = verCfg.getRevisionInfoQueryCreator().getRevisionDateQuery(session, revision);
Criteria query = verCfg.getRevisionInfoQueryCreator().getRevisionDateQuery(session, revision);
try {
Object timestampObject = query.uniqueResult();
@ -172,7 +172,7 @@ public class AuditReaderImpl implements AuditReaderImplementor {
checkNotNull(date, "Date of revision");
checkSession();
Query query = verCfg.getRevisionInfoQueryCreator().getRevisionNumberForDateQuery(session, date);
Criteria query = verCfg.getRevisionInfoQueryCreator().getRevisionNumberForDateQuery(session, date);
try {
Number res = (Number) query.uniqueResult();
@ -195,7 +195,7 @@ public class AuditReaderImpl implements AuditReaderImplementor {
Set<Number> revisions = new HashSet<Number>(1);
revisions.add(revision);
Query query = verCfg.getRevisionInfoQueryCreator().getRevisionsQuery(session, revisions);
Criteria query = verCfg.getRevisionInfoQueryCreator().getRevisionsQuery(session, revisions);
try {
T revisionData = (T) query.uniqueResult();
@ -221,7 +221,7 @@ public class AuditReaderImpl implements AuditReaderImplementor {
}
checkSession();
Query query = verCfg.getRevisionInfoQueryCreator().getRevisionsQuery(session, revisions);
Criteria query = verCfg.getRevisionInfoQueryCreator().getRevisionsQuery(session, revisions);
try {
List<T> revisionList = query.list();
@ -288,7 +288,7 @@ public class AuditReaderImpl implements AuditReaderImplementor {
}
Set<Number> revisions = new HashSet<Number>(1);
revisions.add(revision);
Query query = verCfg.getRevisionInfoQueryCreator().getRevisionsQuery(session, revisions);
Criteria query = verCfg.getRevisionInfoQueryCreator().getRevisionsQuery(session, revisions);
Object revisionInfo = query.uniqueResult();
if (revisionInfo != null) {
// If revision exists

View File

@ -23,8 +23,10 @@
*/
package org.hibernate.envers.revisioninfo;
import org.hibernate.Query;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import java.util.Date;
import java.util.Set;
@ -34,56 +36,30 @@ import java.util.Set;
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
*/
public class RevisionInfoQueryCreator {
private final String revisionDateQuery;
private final String revisionNumberForDateQuery;
private final String revisionsQuery;
private final String revisionInfoEntityName;
private final String revisionInfoIdName;
private final String revisionInfoTimestampName;
private final boolean timestampAsDate;
public RevisionInfoQueryCreator(String revisionInfoEntityName, String revisionInfoIdName,
String revisionInfoTimestampName, boolean timestampAsDate,
String modifiedEntityNamesName) {
String revisionInfoTimestampName, boolean timestampAsDate) {
this.revisionInfoEntityName = revisionInfoEntityName;
this.revisionInfoIdName = revisionInfoIdName;
this.revisionInfoTimestampName = revisionInfoTimestampName;
this.timestampAsDate = timestampAsDate;
revisionDateQuery = new StringBuilder()
.append("select rev.").append(revisionInfoTimestampName)
.append(" from ").append(revisionInfoEntityName)
.append(" rev where ").append(revisionInfoIdName).append(" = :_revision_number")
.toString();
revisionNumberForDateQuery = new StringBuilder()
.append("select max(rev.").append(revisionInfoIdName)
.append(") from ").append(revisionInfoEntityName)
.append(" rev where ").append(revisionInfoTimestampName).append(" <= :_revision_date")
.toString();
if (modifiedEntityNamesName == null) {
// Tracking modified entity classes is not enabled.
revisionsQuery = new StringBuilder()
.append("select rev from ").append(revisionInfoEntityName)
.append(" rev where ").append(revisionInfoIdName)
.append(" in (:_revision_numbers)")
.toString();
} else {
// Modified entity names enabled. Eagerly loading entity names collection.
// HQL queries do not respect any fetch="join" defined in the mapping document.
revisionsQuery = new StringBuilder()
.append("select rev from ").append(revisionInfoEntityName)
.append(" rev join fetch rev.").append(modifiedEntityNamesName)
.append(" ent where rev.").append(revisionInfoIdName)
.append(" in (:_revision_numbers)")
.toString();
}
}
public Query getRevisionDateQuery(Session session, Number revision) {
return session.createQuery(revisionDateQuery).setParameter("_revision_number", revision);
public Criteria getRevisionDateQuery(Session session, Number revision) {
return session.createCriteria(revisionInfoEntityName).setProjection(Projections.property(revisionInfoTimestampName))
.add(Restrictions.eq(revisionInfoIdName, revision));
}
public Query getRevisionNumberForDateQuery(Session session, Date date) {
return session.createQuery(revisionNumberForDateQuery).setParameter("_revision_date", timestampAsDate ? date : date.getTime());
public Criteria getRevisionNumberForDateQuery(Session session, Date date) {
return session.createCriteria(revisionInfoEntityName).setProjection(Projections.max(revisionInfoIdName))
.add(Restrictions.le(revisionInfoTimestampName, timestampAsDate ? date : date.getTime()));
}
public Query getRevisionsQuery(Session session, Set<Number> revisions) {
return session.createQuery(revisionsQuery).setParameterList("_revision_numbers", revisions);
public Criteria getRevisionsQuery(Session session, Set<Number> revisions) {
return session.createCriteria(revisionInfoEntityName).add(Restrictions.in(revisionInfoIdName, revisions));
}
}