HHH-4787 - AuditProperty.isNull() query fix and tests
This commit is contained in:
parent
f831eab7e5
commit
0850fd009a
|
@ -62,7 +62,7 @@ public abstract class AbstractIdMapper implements IdMapper {
|
||||||
QueryParameterData paramData1 = paramDataIter1.next();
|
QueryParameterData paramData1 = paramDataIter1.next();
|
||||||
QueryParameterData paramData2 = paramDataIter2.next();
|
QueryParameterData paramData2 = paramDataIter2.next();
|
||||||
|
|
||||||
parametersToUse.addWhere(paramData1.getProperty(prefix1), false, "=", paramData2.getProperty(prefix2), false);
|
parametersToUse.addWhere(paramData1.getProperty(prefix1), false, "=", paramData2.getProperty(prefix2), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,7 +72,11 @@ public abstract class AbstractIdMapper implements IdMapper {
|
||||||
Parameters parametersToUse = getParametersToUse(parameters, paramDatas);
|
Parameters parametersToUse = getParametersToUse(parameters, paramDatas);
|
||||||
|
|
||||||
for (QueryParameterData paramData : paramDatas) {
|
for (QueryParameterData paramData : paramDatas) {
|
||||||
parametersToUse.addWhereWithParam(paramData.getProperty(prefix), equals ? "=" : "<>", paramData.getValue());
|
if (paramData.getValue() == null) {
|
||||||
|
handleNullValue(parametersToUse, paramData.getProperty(prefix), equals);
|
||||||
|
} else {
|
||||||
|
parametersToUse.addWhereWithParam(paramData.getProperty(prefix), equals ? "=" : "<>", paramData.getValue());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,4 +89,12 @@ public abstract class AbstractIdMapper implements IdMapper {
|
||||||
parametersToUse.addWhereWithNamedParam(paramData.getProperty(prefix), equals ? "=" : "<>", paramData.getQueryParameterName());
|
parametersToUse.addWhereWithNamedParam(paramData.getProperty(prefix), equals ? "=" : "<>", paramData.getQueryParameterName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleNullValue(Parameters parameters, String propertyName, boolean equals) {
|
||||||
|
if (equals) {
|
||||||
|
parameters.addNullRestriction(propertyName, equals);
|
||||||
|
} else {
|
||||||
|
parameters.addNotNullRestriction(propertyName, equals);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,10 +25,13 @@ 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.mapper.id.QueryParameterData;
|
||||||
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;
|
||||||
import org.hibernate.envers.query.property.PropertyNameGetter;
|
import org.hibernate.envers.query.property.PropertyNameGetter;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adam Warski (adam at warski dot org)
|
* @author Adam Warski (adam at warski dot org)
|
||||||
*/
|
*/
|
||||||
|
@ -44,7 +47,7 @@ public class NotNullAuditExpression implements AuditCriterion {
|
||||||
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
||||||
|
|
||||||
if (relatedEntity == null) {
|
if (relatedEntity == null) {
|
||||||
parameters.addWhereWithParam(propertyName, "<>", null);
|
parameters.addNotNullRestriction(propertyName, true);
|
||||||
} else {
|
} else {
|
||||||
relatedEntity.getIdMapper().addIdEqualsToQuery(parameters, null, propertyName, false);
|
relatedEntity.getIdMapper().addIdEqualsToQuery(parameters, null, propertyName, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class NullAuditExpression implements AuditCriterion {
|
||||||
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName);
|
||||||
|
|
||||||
if (relatedEntity == null) {
|
if (relatedEntity == null) {
|
||||||
parameters.addWhereWithParam(propertyName, "=", null);
|
parameters.addNullRestriction(propertyName, true);
|
||||||
} else {
|
} else {
|
||||||
relatedEntity.getIdMapper().addIdEqualsToQuery(parameters, null, propertyName, true);
|
relatedEntity.getIdMapper().addIdEqualsToQuery(parameters, null, propertyName, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,6 +116,24 @@ public class Parameters {
|
||||||
addWhere(left, true, op, right, true);
|
addWhere(left, true, op, right, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds <code>IS NULL</code> restriction.
|
||||||
|
* @param propertyName Property name.
|
||||||
|
* @param addAlias Positive if alias to property name shall be added.
|
||||||
|
*/
|
||||||
|
public void addNullRestriction(String propertyName, boolean addAlias) {
|
||||||
|
addWhere(propertyName, addAlias, "is", "null", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds <code>IS NOT NULL</code> restriction.
|
||||||
|
* @param propertyName Property name.
|
||||||
|
* @param addAlias Positive if alias to property name shall be added.
|
||||||
|
*/
|
||||||
|
public void addNotNullRestriction(String propertyName, boolean addAlias) {
|
||||||
|
addWhere(propertyName, addAlias, "is not", "null", false);
|
||||||
|
}
|
||||||
|
|
||||||
public void addWhere(String left, boolean addAliasLeft, String op, String right, boolean addAliasRight) {
|
public void addWhere(String left, boolean addAliasLeft, String op, String right, boolean addAliasRight) {
|
||||||
StringBuilder expression = new StringBuilder();
|
StringBuilder expression = new StringBuilder();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
package org.hibernate.envers.test.integration.query;
|
||||||
|
|
||||||
|
import org.hibernate.ejb.Ejb3Configuration;
|
||||||
|
import org.hibernate.envers.query.AuditEntity;
|
||||||
|
import org.hibernate.envers.test.AbstractEntityTest;
|
||||||
|
import org.hibernate.envers.test.Priority;
|
||||||
|
import org.hibernate.envers.test.entities.StrIntTestEntity;
|
||||||
|
import org.hibernate.envers.test.entities.ids.EmbId;
|
||||||
|
import org.hibernate.envers.test.entities.onetomany.CollectionRefEdEntity;
|
||||||
|
import org.hibernate.envers.test.entities.onetomany.CollectionRefIngEntity;
|
||||||
|
import org.hibernate.envers.test.entities.onetomany.ids.SetRefEdEmbIdEntity;
|
||||||
|
import org.hibernate.envers.test.entities.onetomany.ids.SetRefIngEmbIdEntity;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
|
||||||
|
*/
|
||||||
|
public class NullPropertyQuery extends AbstractEntityTest {
|
||||||
|
private Integer idSimplePropertyNull = null;
|
||||||
|
private Integer idSimplePropertyNotNull = null;
|
||||||
|
private EmbId idMulticolumnReferenceToParentNull = new EmbId(0, 1);
|
||||||
|
private Integer idReferenceToParentNotNull = 1;
|
||||||
|
private Integer idParent = 1;
|
||||||
|
|
||||||
|
public void configure(Ejb3Configuration cfg) {
|
||||||
|
cfg.addAnnotatedClass(StrIntTestEntity.class);
|
||||||
|
cfg.addAnnotatedClass(SetRefEdEmbIdEntity.class);
|
||||||
|
cfg.addAnnotatedClass(SetRefIngEmbIdEntity.class);
|
||||||
|
cfg.addAnnotatedClass(CollectionRefEdEntity.class);
|
||||||
|
cfg.addAnnotatedClass(CollectionRefIngEntity.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Priority(10)
|
||||||
|
public void initData() {
|
||||||
|
// Revision 1
|
||||||
|
EntityManager em = getEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
StrIntTestEntity nullSite = new StrIntTestEntity(null, 1);
|
||||||
|
StrIntTestEntity notNullSite = new StrIntTestEntity("data", 2);
|
||||||
|
em.persist(nullSite);
|
||||||
|
em.persist(notNullSite);
|
||||||
|
idSimplePropertyNull = nullSite.getId();
|
||||||
|
idSimplePropertyNotNull = notNullSite.getId();
|
||||||
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
// Revision 2
|
||||||
|
em.getTransaction().begin();
|
||||||
|
SetRefIngEmbIdEntity nullParentSrieie = new SetRefIngEmbIdEntity(idMulticolumnReferenceToParentNull, "data", null);
|
||||||
|
em.persist(nullParentSrieie);
|
||||||
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
// Revision 3
|
||||||
|
em.getTransaction().begin();
|
||||||
|
CollectionRefEdEntity parent = new CollectionRefEdEntity(idParent, "data");
|
||||||
|
CollectionRefIngEntity notNullParentCrie = new CollectionRefIngEntity(idReferenceToParentNotNull, "data", parent);
|
||||||
|
em.persist(parent);
|
||||||
|
em.persist(notNullParentCrie);
|
||||||
|
em.getTransaction().commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSimplePropertyIsNullQuery() {
|
||||||
|
StrIntTestEntity ver = (StrIntTestEntity) getAuditReader().createQuery()
|
||||||
|
.forEntitiesAtRevision(StrIntTestEntity.class, 1)
|
||||||
|
.add(AuditEntity.property("str1").isNull())
|
||||||
|
.getSingleResult();
|
||||||
|
|
||||||
|
assert ver.equals(new StrIntTestEntity(null, 1, idSimplePropertyNull));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSimplePropertyIsNotNullQuery() {
|
||||||
|
StrIntTestEntity ver = (StrIntTestEntity) getAuditReader().createQuery()
|
||||||
|
.forEntitiesAtRevision(StrIntTestEntity.class, 1)
|
||||||
|
.add(AuditEntity.property("str1").isNotNull())
|
||||||
|
.getSingleResult();
|
||||||
|
|
||||||
|
assert ver.equals(new StrIntTestEntity("data", 2, idSimplePropertyNotNull));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testReferenceMulticolumnPropertyIsNullQuery() {
|
||||||
|
SetRefIngEmbIdEntity ver = (SetRefIngEmbIdEntity) getAuditReader().createQuery()
|
||||||
|
.forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 2)
|
||||||
|
.add(AuditEntity.property("reference").isNull())
|
||||||
|
.getSingleResult();
|
||||||
|
|
||||||
|
assert ver.getId().equals(idMulticolumnReferenceToParentNull);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testReferencePropertyIsNotNullQuery() {
|
||||||
|
CollectionRefIngEntity ver = (CollectionRefIngEntity) getAuditReader().createQuery()
|
||||||
|
.forEntitiesAtRevision(CollectionRefIngEntity.class, 3)
|
||||||
|
.add(AuditEntity.property("reference").isNotNull())
|
||||||
|
.getSingleResult();
|
||||||
|
|
||||||
|
assert ver.getId().equals(idReferenceToParentNotNull);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue