HHH-8036 - Fix and test
This commit is contained in:
parent
36c8a2e0fd
commit
18d2f136f8
|
@ -22,6 +22,8 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query;
|
package org.hibernate.envers.query;
|
||||||
|
|
||||||
|
import org.hibernate.criterion.Restrictions;
|
||||||
import org.hibernate.envers.RevisionType;
|
import org.hibernate.envers.RevisionType;
|
||||||
import org.hibernate.envers.query.criteria.AuditConjunction;
|
import org.hibernate.envers.query.criteria.AuditConjunction;
|
||||||
import org.hibernate.envers.query.criteria.AuditCriterion;
|
import org.hibernate.envers.query.criteria.AuditCriterion;
|
||||||
|
@ -39,7 +41,7 @@ import org.hibernate.envers.query.property.RevisionTypePropertyName;
|
||||||
/**
|
/**
|
||||||
* TODO: ilike
|
* TODO: ilike
|
||||||
* @author Adam Warski (adam at warski dot org)
|
* @author Adam Warski (adam at warski dot org)
|
||||||
* @see org.hibernate.criterion.Restrictions
|
* @see Restrictions
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"JavaDoc"})
|
@SuppressWarnings({"JavaDoc"})
|
||||||
public class AuditEntity {
|
public class AuditEntity {
|
||||||
|
|
|
@ -27,6 +27,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
import org.hibernate.envers.query.property.PropertyNameGetter;
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -54,8 +55,9 @@ public class AggregatedAuditExpression implements AuditCriterion, ExtendableCrit
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
String propertyName = propertyNameGetter.get(auditCfg);
|
QueryBuilder qb, Parameters parameters) {
|
||||||
|
String propertyName = CriteriaTools.determinePropertyName( auditCfg, versionsReader, entityName, propertyNameGetter );
|
||||||
|
|
||||||
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName);
|
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName);
|
||||||
|
|
||||||
|
@ -67,8 +69,8 @@ public class AggregatedAuditExpression implements AuditCriterion, ExtendableCrit
|
||||||
// Adding all specified conditions both to the main query, as well as to the
|
// Adding all specified conditions both to the main query, as well as to the
|
||||||
// aggregated one.
|
// aggregated one.
|
||||||
for (AuditCriterion versionsCriteria : criterions) {
|
for (AuditCriterion versionsCriteria : criterions) {
|
||||||
versionsCriteria.addToQuery(auditCfg, entityName, qb, subParams);
|
versionsCriteria.addToQuery(auditCfg, versionsReader, entityName, qb, subParams);
|
||||||
versionsCriteria.addToQuery(auditCfg, entityName, subQb, subQb.getRootParameters());
|
versionsCriteria.addToQuery(auditCfg, versionsReader, entityName, subQb, subQb.getRootParameters());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setting the desired projection of the aggregated query
|
// Setting the desired projection of the aggregated query
|
||||||
|
|
|
@ -26,6 +26,7 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -44,14 +45,15 @@ public class AuditConjunction implements AuditCriterion, ExtendableCriterion {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
|
QueryBuilder qb, Parameters parameters) {
|
||||||
Parameters andParameters = parameters.addSubParameters(Parameters.AND);
|
Parameters andParameters = parameters.addSubParameters(Parameters.AND);
|
||||||
|
|
||||||
if (criterions.size() == 0) {
|
if (criterions.size() == 0) {
|
||||||
andParameters.addWhere("1", false, "=", "1", false);
|
andParameters.addWhere("1", false, "=", "1", false);
|
||||||
} else {
|
} else {
|
||||||
for (AuditCriterion criterion : criterions) {
|
for (AuditCriterion criterion : criterions) {
|
||||||
criterion.addToQuery(verCfg, entityName, qb, andParameters);
|
criterion.addToQuery(verCfg, versionsReader, entityName, qb, andParameters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,9 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -30,5 +32,6 @@ import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
* @author Adam Warski (adam at warski dot org)
|
* @author Adam Warski (adam at warski dot org)
|
||||||
*/
|
*/
|
||||||
public interface AuditCriterion {
|
public interface AuditCriterion {
|
||||||
void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters);
|
void addToQuery(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
|
QueryBuilder qb, Parameters parameters);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -44,14 +45,15 @@ public class AuditDisjunction implements AuditCriterion, ExtendableCriterion {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
|
QueryBuilder qb, Parameters parameters) {
|
||||||
Parameters orParameters = parameters.addSubParameters(Parameters.OR);
|
Parameters orParameters = parameters.addSubParameters(Parameters.OR);
|
||||||
|
|
||||||
if (criterions.size() == 0) {
|
if (criterions.size() == 0) {
|
||||||
orParameters.addWhere("0", false, "=", "1", false);
|
orParameters.addWhere("0", false, "=", "1", false);
|
||||||
} else {
|
} else {
|
||||||
for (AuditCriterion criterion : criterions) {
|
for (AuditCriterion criterion : criterions) {
|
||||||
criterion.addToQuery(verCfg, entityName, qb, orParameters);
|
criterion.addToQuery(verCfg, versionsReader, entityName, qb, orParameters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,40 +21,63 @@
|
||||||
* 51 Franklin Street, Fifth Floor
|
* 51 Franklin Street, Fifth Floor
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.query.projection.AuditProjection;
|
import org.hibernate.envers.query.projection.AuditProjection;
|
||||||
import org.hibernate.envers.query.projection.PropertyAuditProjection;
|
import org.hibernate.envers.query.projection.PropertyAuditProjection;
|
||||||
|
import org.hibernate.envers.query.property.EntityPropertyName;
|
||||||
import org.hibernate.envers.query.property.OriginalIdPropertyName;
|
import org.hibernate.envers.query.property.OriginalIdPropertyName;
|
||||||
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create restrictions and projections for the id of an audited entity.
|
* Create restrictions and projections for the id of an audited entity.
|
||||||
|
*
|
||||||
* @author Adam Warski (adam at warski dot org)
|
* @author Adam Warski (adam at warski dot org)
|
||||||
|
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"JavaDoc"})
|
@SuppressWarnings({ "JavaDoc" })
|
||||||
public class AuditId {
|
public class AuditId<T> extends AuditProperty<T> {
|
||||||
/**
|
public static final String IDENTIFIER_PLACEHOLDER = "$$id$$";
|
||||||
|
private static final PropertyNameGetter identifierPropertyGetter = new EntityPropertyName( IDENTIFIER_PLACEHOLDER );
|
||||||
|
|
||||||
|
public AuditId() {
|
||||||
|
super( identifierPropertyGetter );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
* Apply an "equal" constraint
|
* Apply an "equal" constraint
|
||||||
*/
|
*/
|
||||||
public AuditCriterion eq(Object id) {
|
public AuditCriterion eq(Object id) {
|
||||||
return new IdentifierEqAuditExpression(id, true);
|
return new IdentifierEqAuditExpression( id, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply a "not equal" constraint
|
* Apply a "not equal" constraint
|
||||||
*/
|
*/
|
||||||
public AuditCriterion ne(Object id) {
|
public AuditCriterion ne(Object id) {
|
||||||
return new IdentifierEqAuditExpression(id, false);
|
return new IdentifierEqAuditExpression( id, false );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Projections
|
// Projections
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Projection counting the values
|
* Projection counting the values
|
||||||
* TODO: idPropertyName isn't needed, should be read from the configuration
|
*
|
||||||
* @param idPropertyName Name of the identifier property
|
* @param idPropertyName Name of the identifier property
|
||||||
*/
|
*
|
||||||
public AuditProjection count(String idPropertyName) {
|
* @deprecated Use {@link #count()}.
|
||||||
return new PropertyAuditProjection(new OriginalIdPropertyName(idPropertyName), "count", false);
|
*/
|
||||||
}
|
public AuditProjection count(String idPropertyName) {
|
||||||
|
return new PropertyAuditProjection( new OriginalIdPropertyName( idPropertyName ), "count", false );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AuditCriterion hasChanged() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AuditCriterion hasNotChanged() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -24,6 +24,7 @@
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
import org.hibernate.envers.query.property.PropertyNameGetter;
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -41,8 +42,9 @@ public class BetweenAuditExpression implements AuditCriterion {
|
||||||
this.hi = hi;
|
this.hi = hi;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
String propertyName = propertyNameGetter.get(auditCfg);
|
QueryBuilder qb, Parameters parameters) {
|
||||||
|
String propertyName = CriteriaTools.determinePropertyName( auditCfg, versionsReader, entityName, propertyNameGetter );
|
||||||
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName);
|
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName);
|
||||||
|
|
||||||
Parameters subParams = parameters.addSubParameters(Parameters.AND);
|
Parameters subParams = parameters.addSubParameters(Parameters.AND);
|
||||||
|
|
|
@ -22,10 +22,13 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
import org.hibernate.envers.entities.RelationDescription;
|
import org.hibernate.envers.entities.RelationDescription;
|
||||||
import org.hibernate.envers.entities.RelationType;
|
import org.hibernate.envers.entities.RelationType;
|
||||||
import org.hibernate.envers.exception.AuditException;
|
import org.hibernate.envers.exception.AuditException;
|
||||||
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adam Warski (adam at warski dot org)
|
* @author Adam Warski (adam at warski dot org)
|
||||||
|
@ -56,4 +59,28 @@ public class CriteriaTools {
|
||||||
throw new AuditException("This type of relation (" + entityName + "." + propertyName +
|
throw new AuditException("This type of relation (" + entityName + "." + propertyName +
|
||||||
") isn't supported and can't be used in queries.");
|
") isn't supported and can't be used in queries.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see #determinePropertyName(AuditConfiguration, AuditReaderImplementor, String, String)
|
||||||
|
*/
|
||||||
|
public static String determinePropertyName(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader,
|
||||||
|
String entityName, PropertyNameGetter propertyNameGetter) {
|
||||||
|
return determinePropertyName( auditCfg, versionsReader, entityName, propertyNameGetter.get( auditCfg ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param auditCfg Audit configuration.
|
||||||
|
* @param versionsReader Versions reader.
|
||||||
|
* @param entityName Original entity name (not audited).
|
||||||
|
* @param propertyName Property name or placeholder.
|
||||||
|
* @return Path to property. Handles identifier placeholder used by {@link AuditId}.
|
||||||
|
*/
|
||||||
|
public static String determinePropertyName(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader,
|
||||||
|
String entityName, String propertyName) {
|
||||||
|
if ( AuditId.IDENTIFIER_PLACEHOLDER.equals( propertyName ) ) {
|
||||||
|
final String identifierPropertyName = versionsReader.getSessionImplementor().getFactory().getEntityPersister( entityName ).getIdentifierPropertyName();
|
||||||
|
propertyName = auditCfg.getAuditEntCfg().getOriginalIdPropName() + "." + identifierPropertyName;
|
||||||
|
}
|
||||||
|
return propertyName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -39,7 +40,8 @@ public class IdentifierEqAuditExpression implements AuditCriterion {
|
||||||
this.equals = equals;
|
this.equals = equals;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
|
QueryBuilder qb, Parameters parameters) {
|
||||||
verCfg.getEntCfg().get(entityName).getIdMapper()
|
verCfg.getEntCfg().get(entityName).getIdMapper()
|
||||||
.addIdEqualsToQuery(parameters, id, verCfg.getAuditEntCfg().getOriginalIdPropName(), equals);
|
.addIdEqualsToQuery(parameters, id, verCfg.getAuditEntCfg().getOriginalIdPropName(), equals);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,10 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
import org.hibernate.envers.query.property.PropertyNameGetter;
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -39,8 +41,9 @@ public class InAuditExpression implements AuditCriterion {
|
||||||
this.values = values;
|
this.values = values;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
String propertyName = propertyNameGetter.get(auditCfg);
|
QueryBuilder qb, Parameters parameters) {
|
||||||
|
String propertyName = CriteriaTools.determinePropertyName( auditCfg, versionsReader, entityName, propertyNameGetter );
|
||||||
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName);
|
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName);
|
||||||
parameters.addWhereWithParams(propertyName, "in (", values, ")");
|
parameters.addWhereWithParams(propertyName, "in (", values, ")");
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -40,10 +41,11 @@ public class LogicalAuditExpression implements AuditCriterion {
|
||||||
this.op = op;
|
this.op = op;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
|
QueryBuilder qb, Parameters parameters) {
|
||||||
Parameters opParameters = parameters.addSubParameters(op);
|
Parameters opParameters = parameters.addSubParameters(op);
|
||||||
|
|
||||||
lhs.addToQuery(verCfg, entityName, qb, opParameters.addSubParameters("and"));
|
lhs.addToQuery(verCfg, versionsReader, entityName, qb, opParameters.addSubParameters("and"));
|
||||||
rhs.addToQuery(verCfg, entityName, qb, opParameters.addSubParameters("and"));
|
rhs.addToQuery(verCfg, versionsReader, entityName, qb, opParameters.addSubParameters("and"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,9 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -36,7 +38,8 @@ public class NotAuditExpression implements AuditCriterion {
|
||||||
this.criterion = criterion;
|
this.criterion = criterion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
criterion.addToQuery(verCfg, entityName, qb, parameters.addNegatedParameters());
|
QueryBuilder qb, Parameters parameters) {
|
||||||
|
criterion.addToQuery(verCfg, versionsReader, entityName, qb, parameters.addNegatedParameters());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,9 +22,11 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
import org.hibernate.envers.entities.RelationDescription;
|
import org.hibernate.envers.entities.RelationDescription;
|
||||||
import org.hibernate.envers.query.property.PropertyNameGetter;
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -38,8 +40,9 @@ public class NotNullAuditExpression implements AuditCriterion {
|
||||||
this.propertyNameGetter = propertyNameGetter;
|
this.propertyNameGetter = propertyNameGetter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
String propertyName = propertyNameGetter.get(auditCfg);
|
QueryBuilder qb, Parameters parameters) {
|
||||||
|
String propertyName = CriteriaTools.determinePropertyName( auditCfg, versionsReader, entityName, propertyNameGetter );
|
||||||
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
||||||
|
|
||||||
if (relatedEntity == null) {
|
if (relatedEntity == null) {
|
||||||
|
|
|
@ -22,9 +22,11 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
import org.hibernate.envers.entities.RelationDescription;
|
import org.hibernate.envers.entities.RelationDescription;
|
||||||
import org.hibernate.envers.query.property.PropertyNameGetter;
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -38,8 +40,9 @@ public class NullAuditExpression implements AuditCriterion {
|
||||||
this.propertyNameGetter = propertyNameGetter;
|
this.propertyNameGetter = propertyNameGetter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
String propertyName = propertyNameGetter.get(auditCfg);
|
QueryBuilder qb, Parameters parameters) {
|
||||||
|
String propertyName = CriteriaTools.determinePropertyName( auditCfg, versionsReader, entityName, propertyNameGetter );
|
||||||
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
||||||
|
|
||||||
if (relatedEntity == null) {
|
if (relatedEntity == null) {
|
||||||
|
|
|
@ -22,8 +22,10 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
import org.hibernate.envers.query.property.PropertyNameGetter;
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -41,8 +43,9 @@ public class PropertyAuditExpression implements AuditCriterion {
|
||||||
this.op = op;
|
this.op = op;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
String propertyName = propertyNameGetter.get(auditCfg);
|
QueryBuilder qb, Parameters parameters) {
|
||||||
|
String propertyName = CriteriaTools.determinePropertyName( auditCfg, versionsReader, entityName, propertyNameGetter );
|
||||||
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName);
|
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName);
|
||||||
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, otherPropertyName);
|
CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, otherPropertyName);
|
||||||
parameters.addWhere(propertyName, op, otherPropertyName);
|
parameters.addWhere(propertyName, op, otherPropertyName);
|
||||||
|
|
|
@ -22,10 +22,12 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
import org.hibernate.envers.entities.RelationDescription;
|
import org.hibernate.envers.entities.RelationDescription;
|
||||||
import org.hibernate.envers.exception.AuditException;
|
import org.hibernate.envers.exception.AuditException;
|
||||||
import org.hibernate.envers.query.property.PropertyNameGetter;
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -43,8 +45,9 @@ public class RelatedAuditExpression implements AuditCriterion {
|
||||||
this.equals = equals;
|
this.equals = equals;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
String propertyName = propertyNameGetter.get(auditCfg);
|
QueryBuilder qb, Parameters parameters) {
|
||||||
|
String propertyName = CriteriaTools.determinePropertyName( auditCfg, versionsReader, entityName, propertyNameGetter );
|
||||||
|
|
||||||
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,10 @@
|
||||||
* 51 Franklin Street, Fifth Floor
|
* 51 Franklin Street, Fifth Floor
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -39,7 +40,8 @@ public class RevisionTypeAuditExpression implements AuditCriterion {
|
||||||
this.op = op;
|
this.op = op;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
|
QueryBuilder qb, Parameters parameters) {
|
||||||
parameters.addWhereWithParam(verCfg.getAuditEntCfg().getRevisionTypePropName(), op, value);
|
parameters.addWhereWithParam(verCfg.getAuditEntCfg().getRevisionTypePropName(), op, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -22,10 +22,12 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.query.criteria;
|
package org.hibernate.envers.query.criteria;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
import org.hibernate.envers.entities.RelationDescription;
|
import org.hibernate.envers.entities.RelationDescription;
|
||||||
import org.hibernate.envers.exception.AuditException;
|
import org.hibernate.envers.exception.AuditException;
|
||||||
import org.hibernate.envers.query.property.PropertyNameGetter;
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
import org.hibernate.envers.tools.query.Parameters;
|
import org.hibernate.envers.tools.query.Parameters;
|
||||||
import org.hibernate.envers.tools.query.QueryBuilder;
|
import org.hibernate.envers.tools.query.QueryBuilder;
|
||||||
|
|
||||||
|
@ -43,8 +45,9 @@ public class SimpleAuditExpression implements AuditCriterion {
|
||||||
this.op = op;
|
this.op = op;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
|
public void addToQuery(AuditConfiguration auditCfg, AuditReaderImplementor versionsReader, String entityName,
|
||||||
String propertyName = propertyNameGetter.get(auditCfg);
|
QueryBuilder qb, Parameters parameters) {
|
||||||
|
String propertyName = CriteriaTools.determinePropertyName( auditCfg, versionsReader, entityName, propertyNameGetter );
|
||||||
|
|
||||||
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.hibernate.envers.entities.EntityInstantiator;
|
||||||
import org.hibernate.envers.exception.AuditException;
|
import org.hibernate.envers.exception.AuditException;
|
||||||
import org.hibernate.envers.query.AuditQuery;
|
import org.hibernate.envers.query.AuditQuery;
|
||||||
import org.hibernate.envers.query.criteria.AuditCriterion;
|
import org.hibernate.envers.query.criteria.AuditCriterion;
|
||||||
|
import org.hibernate.envers.query.criteria.CriteriaTools;
|
||||||
import org.hibernate.envers.query.order.AuditOrder;
|
import org.hibernate.envers.query.order.AuditOrder;
|
||||||
import org.hibernate.envers.query.projection.AuditProjection;
|
import org.hibernate.envers.query.projection.AuditProjection;
|
||||||
import org.hibernate.envers.reader.AuditReaderImplementor;
|
import org.hibernate.envers.reader.AuditReaderImplementor;
|
||||||
|
@ -64,7 +65,7 @@ public abstract class AbstractAuditQuery implements AuditQuery {
|
||||||
protected boolean hasOrder;
|
protected boolean hasOrder;
|
||||||
|
|
||||||
protected final AuditConfiguration verCfg;
|
protected final AuditConfiguration verCfg;
|
||||||
private final AuditReaderImplementor versionsReader;
|
protected final AuditReaderImplementor versionsReader;
|
||||||
|
|
||||||
protected AbstractAuditQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader,
|
protected AbstractAuditQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader,
|
||||||
Class<?> cls) {
|
Class<?> cls) {
|
||||||
|
@ -129,15 +130,16 @@ public abstract class AbstractAuditQuery implements AuditQuery {
|
||||||
public AuditQuery addProjection(AuditProjection projection) {
|
public AuditQuery addProjection(AuditProjection projection) {
|
||||||
Triple<String, String, Boolean> projectionData = projection.getData(verCfg);
|
Triple<String, String, Boolean> projectionData = projection.getData(verCfg);
|
||||||
hasProjection = true;
|
hasProjection = true;
|
||||||
qb.addProjection(projectionData.getFirst(), projectionData.getSecond(), projectionData.getThird());
|
String propertyName = CriteriaTools.determinePropertyName( verCfg, versionsReader, entityName, projectionData.getSecond() );
|
||||||
|
qb.addProjection(projectionData.getFirst(), propertyName, projectionData.getThird());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AuditQuery addOrder(AuditOrder order) {
|
public AuditQuery addOrder(AuditOrder order) {
|
||||||
hasOrder = true;
|
hasOrder = true;
|
||||||
|
|
||||||
Pair<String, Boolean> orderData = order.getData(verCfg);
|
Pair<String, Boolean> orderData = order.getData(verCfg);
|
||||||
qb.addOrder(orderData.getFirst(), orderData.getSecond());
|
String propertyName = CriteriaTools.determinePropertyName( verCfg, versionsReader, entityName, orderData.getFirst() );
|
||||||
|
qb.addOrder(propertyName, orderData.getSecond());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ public class EntitiesAtRevisionQuery extends AbstractAuditQuery {
|
||||||
|
|
||||||
// all specified conditions
|
// all specified conditions
|
||||||
for (AuditCriterion criterion : criterions) {
|
for (AuditCriterion criterion : criterions) {
|
||||||
criterion.addToQuery(verCfg, entityName, qb, qb.getRootParameters());
|
criterion.addToQuery(verCfg, versionsReader, entityName, qb, qb.getRootParameters());
|
||||||
}
|
}
|
||||||
|
|
||||||
Query query = buildQuery();
|
Query query = buildQuery();
|
||||||
|
|
|
@ -45,7 +45,7 @@ public class EntitiesModifiedAtRevisionQuery extends AbstractAuditQuery {
|
||||||
|
|
||||||
// all specified conditions
|
// all specified conditions
|
||||||
for (AuditCriterion criterion : criterions) {
|
for (AuditCriterion criterion : criterions) {
|
||||||
criterion.addToQuery(verCfg, entityName, qb, qb.getRootParameters());
|
criterion.addToQuery(verCfg, versionsReader, entityName, qb, qb.getRootParameters());
|
||||||
}
|
}
|
||||||
|
|
||||||
Query query = buildQuery();
|
Query query = buildQuery();
|
||||||
|
|
|
@ -96,7 +96,7 @@ public class RevisionsOfEntityQuery extends AbstractAuditQuery {
|
||||||
|
|
||||||
// all specified conditions, transformed
|
// all specified conditions, transformed
|
||||||
for (AuditCriterion criterion : criterions) {
|
for (AuditCriterion criterion : criterions) {
|
||||||
criterion.addToQuery(verCfg, entityName, qb, qb.getRootParameters());
|
criterion.addToQuery(verCfg, versionsReader, entityName, qb, qb.getRootParameters());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasProjection && !hasOrder) {
|
if (!hasProjection && !hasOrder) {
|
||||||
|
|
|
@ -21,13 +21,16 @@
|
||||||
* 51 Franklin Street, Fifth Floor
|
* 51 Franklin Street, Fifth Floor
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.hibernate.envers.query.property;
|
package org.hibernate.envers.query.property;
|
||||||
|
|
||||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||||
|
import org.hibernate.envers.query.criteria.AuditId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used for specifying restrictions on the identifier.
|
* Used for specifying restrictions on the identifier.
|
||||||
* TODO: idPropertyName should be read basing on auditCfg + entityName
|
*
|
||||||
|
* @deprecated To be removed together with {@link AuditId#count(String)} in version 5.0.
|
||||||
|
*
|
||||||
* @author Adam Warski (adam at warski dot org)
|
* @author Adam Warski (adam at warski dot org)
|
||||||
*/
|
*/
|
||||||
public class OriginalIdPropertyName implements PropertyNameGetter {
|
public class OriginalIdPropertyName implements PropertyNameGetter {
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
package org.hibernate.envers.test.entities.ids;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
|
||||||
|
import org.hibernate.envers.Audited;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@Audited
|
||||||
|
public class UnusualIdNamingEntity implements Serializable {
|
||||||
|
@Id
|
||||||
|
private String uniqueField;
|
||||||
|
|
||||||
|
private String variousData;
|
||||||
|
|
||||||
|
public UnusualIdNamingEntity() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnusualIdNamingEntity(String uniqueField, String variousData) {
|
||||||
|
this.uniqueField = uniqueField;
|
||||||
|
this.variousData = variousData;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if ( this == o ) return true;
|
||||||
|
if ( !( o instanceof UnusualIdNamingEntity) ) return false;
|
||||||
|
|
||||||
|
UnusualIdNamingEntity that = (UnusualIdNamingEntity) o;
|
||||||
|
|
||||||
|
if ( uniqueField != null ? !uniqueField.equals( that.uniqueField ) : that.uniqueField != null ) return false;
|
||||||
|
if ( variousData != null ? !variousData.equals( that.variousData ) : that.variousData != null ) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = uniqueField != null ? uniqueField.hashCode() : 0;
|
||||||
|
result = 31 * result + ( variousData != null ? variousData.hashCode() : 0 );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "UnusualIdNamingEntity(uniqueField = " + uniqueField + ", variousData = " + variousData + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUniqueField() {
|
||||||
|
return uniqueField;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUniqueField(String uniqueField) {
|
||||||
|
this.uniqueField = uniqueField;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVariousData() {
|
||||||
|
return variousData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVariousData(String variousData) {
|
||||||
|
this.variousData = variousData;
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,8 +23,11 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.envers.test.integration.query;
|
package org.hibernate.envers.test.integration.query;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.hibernate.ejb.Ejb3Configuration;
|
import org.hibernate.ejb.Ejb3Configuration;
|
||||||
|
@ -32,53 +35,52 @@ import org.hibernate.envers.query.AuditEntity;
|
||||||
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
|
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
|
||||||
import org.hibernate.envers.test.Priority;
|
import org.hibernate.envers.test.Priority;
|
||||||
import org.hibernate.envers.test.entities.IntTestEntity;
|
import org.hibernate.envers.test.entities.IntTestEntity;
|
||||||
|
import org.hibernate.envers.test.entities.ids.UnusualIdNamingEntity;
|
||||||
|
import org.hibernate.envers.test.tools.TestTools;
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adam Warski (adam at warski dot org)
|
* @author Adam Warski (adam at warski dot org)
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"unchecked"})
|
@SuppressWarnings({"unchecked"})
|
||||||
public class AggregateQuery extends BaseEnversJPAFunctionalTestCase {
|
public class AggregateQuery extends BaseEnversJPAFunctionalTestCase {
|
||||||
public void configure(Ejb3Configuration cfg) {
|
@Override
|
||||||
cfg.addAnnotatedClass(IntTestEntity.class);
|
protected Class<?>[] getAnnotatedClasses() {
|
||||||
}
|
return new Class[] { IntTestEntity.class, UnusualIdNamingEntity.class };
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Priority(10)
|
@Priority(10)
|
||||||
public void initData() {
|
public void initData() {
|
||||||
// Revision 1
|
|
||||||
EntityManager em = getEntityManager();
|
EntityManager em = getEntityManager();
|
||||||
em.getTransaction().begin();
|
|
||||||
|
|
||||||
|
// Revision 1
|
||||||
|
em.getTransaction().begin();
|
||||||
IntTestEntity ite1 = new IntTestEntity(2);
|
IntTestEntity ite1 = new IntTestEntity(2);
|
||||||
IntTestEntity ite2 = new IntTestEntity(10);
|
IntTestEntity ite2 = new IntTestEntity(10);
|
||||||
|
|
||||||
em.persist(ite1);
|
em.persist(ite1);
|
||||||
em.persist(ite2);
|
em.persist(ite2);
|
||||||
|
|
||||||
Integer id1 = ite1.getId();
|
Integer id1 = ite1.getId();
|
||||||
Integer id2 = ite2.getId();
|
Integer id2 = ite2.getId();
|
||||||
|
|
||||||
em.getTransaction().commit();
|
em.getTransaction().commit();
|
||||||
|
|
||||||
// Revision 2
|
// Revision 2
|
||||||
em.getTransaction().begin();
|
em.getTransaction().begin();
|
||||||
|
|
||||||
IntTestEntity ite3 = new IntTestEntity(8);
|
IntTestEntity ite3 = new IntTestEntity(8);
|
||||||
|
UnusualIdNamingEntity uine1 = new UnusualIdNamingEntity( "id1", "data1" );
|
||||||
|
em.persist( uine1 );
|
||||||
em.persist(ite3);
|
em.persist(ite3);
|
||||||
|
|
||||||
ite1 = em.find(IntTestEntity.class, id1);
|
ite1 = em.find(IntTestEntity.class, id1);
|
||||||
|
|
||||||
ite1.setNumber(0);
|
ite1.setNumber(0);
|
||||||
|
|
||||||
em.getTransaction().commit();
|
em.getTransaction().commit();
|
||||||
|
|
||||||
// Revision 3
|
// Revision 3
|
||||||
em.getTransaction().begin();
|
em.getTransaction().begin();
|
||||||
|
|
||||||
ite2 = em.find(IntTestEntity.class, id2);
|
ite2 = em.find(IntTestEntity.class, id2);
|
||||||
|
|
||||||
ite2.setNumber(52);
|
ite2.setNumber(52);
|
||||||
|
|
||||||
em.getTransaction().commit();
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
em.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -110,4 +112,69 @@ public class AggregateQuery extends BaseEnversJPAFunctionalTestCase {
|
||||||
assert (Integer) ver3[0] == 52;
|
assert (Integer) ver3[0] == 52;
|
||||||
assert (Double) ver3[1] == 20.0;
|
assert (Double) ver3[1] == 20.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-8036" )
|
||||||
|
public void testEntityIdProjection() {
|
||||||
|
Integer maxId = (Integer) getAuditReader().createQuery().forRevisionsOfEntity( IntTestEntity.class, true, true )
|
||||||
|
.addProjection( AuditEntity.id().max() )
|
||||||
|
.add( AuditEntity.revisionNumber().gt( 2 ) )
|
||||||
|
.getSingleResult();
|
||||||
|
Assert.assertEquals( Integer.valueOf( 2 ), maxId );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-8036" )
|
||||||
|
public void testEntityIdRestriction() {
|
||||||
|
List<IntTestEntity> list = getAuditReader().createQuery().forRevisionsOfEntity( IntTestEntity.class, true, true )
|
||||||
|
.add( AuditEntity.id().between( 2, 3 ) )
|
||||||
|
.getResultList();
|
||||||
|
Assert.assertTrue(
|
||||||
|
TestTools.checkList( list,
|
||||||
|
new IntTestEntity( 10, 2 ), new IntTestEntity( 8, 3 ), new IntTestEntity( 52, 2 )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-8036" )
|
||||||
|
public void testEntityIdOrdering() {
|
||||||
|
List<IntTestEntity> list = getAuditReader().createQuery().forRevisionsOfEntity( IntTestEntity.class, true, true )
|
||||||
|
.add( AuditEntity.revisionNumber().lt( 2 ) )
|
||||||
|
.addOrder( AuditEntity.id().desc() )
|
||||||
|
.getResultList();
|
||||||
|
Assert.assertEquals( Arrays.asList( new IntTestEntity( 10, 2 ), new IntTestEntity( 2, 1 ) ), list );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-8036" )
|
||||||
|
public void testUnusualIdFieldName() {
|
||||||
|
UnusualIdNamingEntity entity = (UnusualIdNamingEntity) getAuditReader().createQuery()
|
||||||
|
.forRevisionsOfEntity( UnusualIdNamingEntity.class, true, true )
|
||||||
|
.add( AuditEntity.id().like( "id1" ) )
|
||||||
|
.getSingleResult();
|
||||||
|
Assert.assertEquals( new UnusualIdNamingEntity( "id1", "data1" ), entity );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-8036" )
|
||||||
|
public void testEntityIdModifiedFlagNotSupported() {
|
||||||
|
try {
|
||||||
|
getAuditReader().createQuery().forRevisionsOfEntity( IntTestEntity.class, true, true )
|
||||||
|
.add( AuditEntity.id().hasChanged() )
|
||||||
|
.getResultList();
|
||||||
|
}
|
||||||
|
catch ( UnsupportedOperationException e1 ) {
|
||||||
|
try {
|
||||||
|
getAuditReader().createQuery().forRevisionsOfEntity( IntTestEntity.class, true, true )
|
||||||
|
.add( AuditEntity.id().hasNotChanged() )
|
||||||
|
.getResultList();
|
||||||
|
}
|
||||||
|
catch ( UnsupportedOperationException e2 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Assert.fail();
|
||||||
|
}
|
||||||
|
Assert.fail();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -82,7 +82,7 @@ public class DeletedEntities extends BaseEnversJPAFunctionalTestCase {
|
||||||
assert (Long) getAuditReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 1)
|
assert (Long) getAuditReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 1)
|
||||||
.addProjection(AuditEntity.id().count("id")).getResultList().get(0) == 2;
|
.addProjection(AuditEntity.id().count("id")).getResultList().get(0) == 2;
|
||||||
assert (Long) getAuditReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 2)
|
assert (Long) getAuditReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 2)
|
||||||
.addProjection(AuditEntity.id().count("id")).getResultList().get(0) == 1;
|
.addProjection(AuditEntity.id().count()).getResultList().get(0) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue