HHH-15113 Exception setting ParameterExpressions on Update Queries
This commit is contained in:
parent
741b6b71f1
commit
2d19bdbaf3
|
@ -74,6 +74,7 @@ import org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath;
|
|||
import org.hibernate.query.sqm.tree.domain.SqmSetJoin;
|
||||
import org.hibernate.query.sqm.tree.domain.SqmSingularJoin;
|
||||
import org.hibernate.query.sqm.tree.expression.JpaCriteriaParameter;
|
||||
import org.hibernate.query.sqm.tree.expression.SqmParameter;
|
||||
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
|
||||
import org.hibernate.query.sqm.tree.expression.SqmBinaryArithmetic;
|
||||
import org.hibernate.query.sqm.tree.expression.SqmCaseSearched;
|
||||
|
@ -1420,6 +1421,9 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, SqmCreationContext,
|
|||
*/
|
||||
@Override
|
||||
public <T> SqmExpression<T> value(T value, SqmExpression<? extends T> typeInferenceSource) {
|
||||
if ( value instanceof SqmExpression ) {
|
||||
return (SqmExpression<T>) value;
|
||||
}
|
||||
if ( criteriaValueHandlingMode == ValueHandlingMode.INLINE ) {
|
||||
return literal( value, typeInferenceSource );
|
||||
}
|
||||
|
@ -1457,6 +1461,9 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, SqmCreationContext,
|
|||
|
||||
@Override
|
||||
public <T> SqmExpression<T> value(T value) {
|
||||
if ( value instanceof SqmExpression ) {
|
||||
return (SqmExpression<T>) value;
|
||||
}
|
||||
if ( criteriaValueHandlingMode == ValueHandlingMode.INLINE ) {
|
||||
return literal( value );
|
||||
}
|
||||
|
|
|
@ -0,0 +1,100 @@
|
|||
package org.hibernate.orm.test.jpa.query;
|
||||
|
||||
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||
import org.hibernate.testing.orm.junit.Jpa;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.Query;
|
||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||
import jakarta.persistence.criteria.CriteriaUpdate;
|
||||
import jakarta.persistence.criteria.ParameterExpression;
|
||||
import jakarta.persistence.criteria.Root;
|
||||
import jakarta.persistence.metamodel.EntityType;
|
||||
|
||||
@Jpa(
|
||||
annotatedClasses = CriteriaUpdateWithParametersTest.Person.class
|
||||
)
|
||||
public class CriteriaUpdateWithParametersTest {
|
||||
|
||||
@Test
|
||||
public void testCriteriaUpdate(EntityManagerFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
entityManager -> {
|
||||
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
|
||||
final CriteriaUpdate<Person> criteriaUpdate = criteriaBuilder.createCriteriaUpdate( Person.class );
|
||||
final Root<Person> root = criteriaUpdate.from( Person.class );
|
||||
|
||||
final ParameterExpression<Integer> intValueParameter = criteriaBuilder.parameter( Integer.class );
|
||||
final ParameterExpression<String> stringValueParameter = criteriaBuilder.parameter( String.class );
|
||||
|
||||
final EntityType<Person> personEntityType = entityManager.getMetamodel().entity( Person.class );
|
||||
|
||||
criteriaUpdate.set(
|
||||
root.get( personEntityType.getSingularAttribute( "age", Integer.class ) ),
|
||||
intValueParameter
|
||||
);
|
||||
criteriaUpdate.where( criteriaBuilder.equal(
|
||||
root.get( personEntityType.getSingularAttribute( "name", String.class ) ),
|
||||
stringValueParameter
|
||||
) );
|
||||
|
||||
final Query query = entityManager.createQuery( criteriaUpdate );
|
||||
query.setParameter( intValueParameter, 9 );
|
||||
query.setParameter( stringValueParameter, "Luigi" );
|
||||
|
||||
query.executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCriteriaUpdate2(EntityManagerFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
entityManager -> {
|
||||
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
|
||||
final CriteriaUpdate<Person> criteriaUpdate = criteriaBuilder.createCriteriaUpdate( Person.class );
|
||||
final Root<Person> root = criteriaUpdate.from( Person.class );
|
||||
|
||||
final ParameterExpression<Integer> intValueParameter = criteriaBuilder.parameter( Integer.class );
|
||||
final ParameterExpression<String> stringValueParameter = criteriaBuilder.parameter( String.class );
|
||||
|
||||
criteriaUpdate.set( "age", intValueParameter );
|
||||
criteriaUpdate.where( criteriaBuilder.equal( root.get( "name" ), stringValueParameter ) );
|
||||
|
||||
final Query query = entityManager.createQuery( criteriaUpdate );
|
||||
query.setParameter( intValueParameter, 9 );
|
||||
query.setParameter( stringValueParameter, "Luigi" );
|
||||
|
||||
query.executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Entity(name = "Person")
|
||||
public static class Person {
|
||||
|
||||
@Id
|
||||
private String id;
|
||||
|
||||
private String name;
|
||||
|
||||
private Integer age;
|
||||
|
||||
public Person() {
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public Integer getAge() {
|
||||
return age;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue