HHH-17493 - add tests and fix
Signed-off-by: Jan Schatteman <jschatte@redhat.com>
This commit is contained in:
parent
c1af23867d
commit
089a935cb6
|
@ -44,12 +44,7 @@ public abstract class AbstractNegatableSqmPredicate extends AbstractSqmPredicate
|
||||||
public SqmNegatablePredicate not() {
|
public SqmNegatablePredicate not() {
|
||||||
// in certain cases JPA required that this always return
|
// in certain cases JPA required that this always return
|
||||||
// a new instance.
|
// a new instance.
|
||||||
if ( nodeBuilder().isJpaQueryComplianceEnabled() ) {
|
return createNegatedNode();
|
||||||
return createNegatedNode();
|
|
||||||
}
|
|
||||||
|
|
||||||
negate();
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,4 +145,10 @@ public class SqmLikePredicate extends AbstractNegatableSqmPredicate {
|
||||||
protected SqmNegatablePredicate createNegatedNode() {
|
protected SqmNegatablePredicate createNegatedNode() {
|
||||||
return new SqmLikePredicate( matchExpression, pattern, escapeCharacter, !isNegated(), nodeBuilder() );
|
return new SqmLikePredicate( matchExpression, pattern, escapeCharacter, !isNegated(), nodeBuilder() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SqmNegatablePredicate not() {
|
||||||
|
negate();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,4 +79,5 @@ public class SqmNegatedPredicate extends AbstractNegatableSqmPredicate {
|
||||||
protected SqmNegatablePredicate createNegatedNode() {
|
protected SqmNegatablePredicate createNegatedNode() {
|
||||||
return new SqmNegatedPredicate( this, nodeBuilder() );
|
return new SqmNegatedPredicate( this, nodeBuilder() );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.criteria.basic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.JiraKey;
|
||||||
|
import org.hibernate.testing.orm.junit.Jpa;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
|
import jakarta.persistence.criteria.Root;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jan Schatteman
|
||||||
|
*/
|
||||||
|
@Jpa(
|
||||||
|
annotatedClasses = {Wall.class},
|
||||||
|
jpaComplianceEnabled = false
|
||||||
|
)
|
||||||
|
@JiraKey( value = "HHH-17493" )
|
||||||
|
public class NegatedPredicateTest {
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setup(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
Wall wall1 = new Wall();
|
||||||
|
wall1.setColor( "yellow" );
|
||||||
|
Wall wall2 = new Wall();
|
||||||
|
wall2.setColor( "green" );
|
||||||
|
Wall wall3 = new Wall();
|
||||||
|
wall3.setColor( "red" );
|
||||||
|
entityManager.persist( wall1 );
|
||||||
|
entityManager.persist( wall2 );
|
||||||
|
entityManager.persist( wall3 );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void tearDown(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> entityManager.createQuery( "delete from Wall" ).executeUpdate()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNegatedPredicate(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<Wall> query = cb.createQuery( Wall.class );
|
||||||
|
Root<Wall> root = query.from( Wall.class );
|
||||||
|
query.select( root ).where(
|
||||||
|
cb.not(
|
||||||
|
cb.or(
|
||||||
|
cb.equal(root.get( "color" ), "yellow"),
|
||||||
|
cb.equal(root.get( "color" ), "red")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
Wall result = entityManager.createQuery( query ).getSingleResult();
|
||||||
|
assertNotNull( result );
|
||||||
|
assertEquals("green", result.getColor());
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleNegatedPredicate(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<Wall> query = cb.createQuery( Wall.class );
|
||||||
|
Root<Wall> root = query.from( Wall.class );
|
||||||
|
query.select( root ).where(
|
||||||
|
cb.not(
|
||||||
|
cb.not(
|
||||||
|
cb.or(
|
||||||
|
cb.equal(root.get( "color" ), "yellow"),
|
||||||
|
cb.equal(root.get( "color" ), "red")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
query.orderBy( cb.asc(root.get("id")) );
|
||||||
|
List<Wall> result = entityManager.createQuery( query ).getResultList();
|
||||||
|
assertEquals( 2, result.size() );
|
||||||
|
assertEquals("yellow", result.get(0).getColor());
|
||||||
|
assertEquals("red", result.get(1).getColor());
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.criteria.basic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.JiraKey;
|
||||||
|
import org.hibernate.testing.orm.junit.Jpa;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
|
import jakarta.persistence.criteria.Root;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jan Schatteman
|
||||||
|
*/
|
||||||
|
@Jpa(
|
||||||
|
annotatedClasses = {Wall.class},
|
||||||
|
jpaComplianceEnabled = true
|
||||||
|
)
|
||||||
|
@JiraKey( value = "HHH-17493" )
|
||||||
|
public class WithJpaComplianceNegatedPredicateTest {
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setup(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
Wall wall1 = new Wall();
|
||||||
|
wall1.setColor( "yellow" );
|
||||||
|
Wall wall2 = new Wall();
|
||||||
|
wall2.setColor( "green" );
|
||||||
|
Wall wall3 = new Wall();
|
||||||
|
wall3.setColor( "red" );
|
||||||
|
entityManager.persist( wall1 );
|
||||||
|
entityManager.persist( wall2 );
|
||||||
|
entityManager.persist( wall3 );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void tearDown(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> entityManager.createQuery( "delete from Wall" ).executeUpdate()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNegatedPredicate(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<Wall> query = cb.createQuery( Wall.class );
|
||||||
|
Root<Wall> root = query.from( Wall.class );
|
||||||
|
query.select( root ).where(
|
||||||
|
cb.not(
|
||||||
|
cb.or(
|
||||||
|
cb.equal(root.get( "color" ), "yellow"),
|
||||||
|
cb.equal(root.get( "color" ), "red")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
Wall result = entityManager.createQuery( query ).getSingleResult();
|
||||||
|
assertNotNull( result );
|
||||||
|
assertEquals("green", result.getColor());
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleNegatedPredicate(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<Wall> query = cb.createQuery( Wall.class );
|
||||||
|
Root<Wall> root = query.from( Wall.class );
|
||||||
|
query.select( root ).where(
|
||||||
|
cb.not(
|
||||||
|
cb.not(
|
||||||
|
cb.or(
|
||||||
|
cb.equal(root.get( "color" ), "yellow"),
|
||||||
|
cb.equal(root.get( "color" ), "red")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
query.orderBy( cb.asc(root.get("id")) );
|
||||||
|
List<Wall> result = entityManager.createQuery( query ).getResultList();
|
||||||
|
assertEquals( 2, result.size() );
|
||||||
|
assertEquals("yellow", result.get(0).getColor());
|
||||||
|
assertEquals("red", result.get(1).getColor());
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue