HHH-17375 Shorthand bracket syntax for array construction
This commit is contained in:
parent
6c805f0637
commit
67d04577be
|
@ -1219,6 +1219,17 @@ include::{array-example-dir-hql}/ArrayConstructorTest.java[tags=hql-array-exampl
|
|||
----
|
||||
====
|
||||
|
||||
Alternatively, it's also possible to construct an array with the shorthand bracket syntax `[` and `]`,
|
||||
which is syntax sugar that translates to the array constructor function.
|
||||
|
||||
[[hql-array-constructor-hql-example]]
|
||||
====
|
||||
[source, JAVA, indent=0]
|
||||
----
|
||||
include::{array-example-dir-hql}/ArrayConstructorTest.java[tags=hql-array-hql-example]
|
||||
----
|
||||
====
|
||||
|
||||
[[hql-array-aggregate-functions]]
|
||||
===== `array_agg()`
|
||||
|
||||
|
|
|
@ -889,6 +889,7 @@ literal
|
|||
| numericLiteral
|
||||
| binaryLiteral
|
||||
| temporalLiteral
|
||||
| arrayLiteral
|
||||
| generalizedLiteral
|
||||
;
|
||||
|
||||
|
@ -1058,6 +1059,13 @@ genericTemporalLiteralText
|
|||
: STRING_LITERAL
|
||||
;
|
||||
|
||||
/**
|
||||
* A generic format for specifying literal values of arbitary types
|
||||
*/
|
||||
arrayLiteral
|
||||
: LEFT_BRACKET (expression (COMMA expression)*)? RIGHT_BRACKET
|
||||
;
|
||||
|
||||
/**
|
||||
* A generic format for specifying literal values of arbitary types
|
||||
*/
|
||||
|
|
|
@ -3441,6 +3441,21 @@ public class SemanticQueryBuilder<R> extends HqlParserBaseVisitor<Object> implem
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visitArrayLiteral(HqlParser.ArrayLiteralContext ctx) {
|
||||
final List<HqlParser.ExpressionContext> expressionContexts = ctx.expression();
|
||||
int count = expressionContexts.size();
|
||||
final List<SqmTypedNode<?>> arguments = new ArrayList<>( count );
|
||||
for ( HqlParser.ExpressionContext expressionContext : expressionContexts ) {
|
||||
arguments.add( (SqmTypedNode<?>) expressionContext.accept( this ) );
|
||||
}
|
||||
return getFunctionDescriptor( "array" ).generateSqmExpression(
|
||||
arguments,
|
||||
null,
|
||||
creationContext.getQueryEngine()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visitGeneralizedLiteral(HqlParser.GeneralizedLiteralContext ctx) {
|
||||
throw new UnsupportedOperationException();
|
||||
|
|
|
@ -109,4 +109,26 @@ public class ArrayConstructorTest {
|
|||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testArrayConstructorSyntaxEmpty(SessionFactoryScope scope) {
|
||||
scope.inSession( em -> {
|
||||
List<EntityWithArrays> results = em.createQuery( "from EntityWithArrays e where e.theArray = []", EntityWithArrays.class )
|
||||
.getResultList();
|
||||
assertEquals( 1, results.size() );
|
||||
assertEquals( 1L, results.get( 0 ).getId() );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testArrayConstructorSyntaxNonEmpty(SessionFactoryScope scope) {
|
||||
scope.inSession( em -> {
|
||||
//tag::hql-array-hql-example[]
|
||||
List<EntityWithArrays> results = em.createQuery( "from EntityWithArrays e where e.theArray is not distinct from ['abc', null, 'def']", EntityWithArrays.class )
|
||||
.getResultList();
|
||||
//end::hql-array-hql-example[]
|
||||
assertEquals( 1, results.size() );
|
||||
assertEquals( 2L, results.get( 0 ).getId() );
|
||||
} );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue