@@ -5629,40 +5629,7 @@ else if ( inferableExpressible instanceof BasicValuedMapping ) {
5629
5629
final BasicValuedMapping basicValuedMapping = (BasicValuedMapping ) inferableExpressible ;
5630
5630
final BasicValueConverter valueConverter = basicValuedMapping .getJdbcMapping ().getValueConverter ();
5631
5631
if ( valueConverter != null ) {
5632
- final Object value = literal .getLiteralValue ();
5633
- final Object sqlLiteralValue ;
5634
- // For converted query literals, we support both, the domain and relational java type
5635
- if ( value == null || valueConverter .getDomainJavaType ().isInstance ( value ) ) {
5636
- sqlLiteralValue = valueConverter .toRelationalValue ( value );
5637
- }
5638
- else if ( valueConverter .getRelationalJavaType ().isInstance ( value ) ) {
5639
- sqlLiteralValue = value ;
5640
- }
5641
- else if ( Character .class .isAssignableFrom ( valueConverter .getRelationalJavaType ().getJavaTypeClass () )
5642
- && value instanceof CharSequence && ( (CharSequence ) value ).length () == 1 ) {
5643
- sqlLiteralValue = ( (CharSequence ) value ).charAt ( 0 );
5644
- }
5645
- // In HQL, number literals might not match the relational java type exactly,
5646
- // so we allow coercion between the number types
5647
- else if ( Number .class .isAssignableFrom ( valueConverter .getRelationalJavaType ().getJavaTypeClass () )
5648
- && value instanceof Number ) {
5649
- sqlLiteralValue = valueConverter .getRelationalJavaType ().coerce (
5650
- value ,
5651
- creationContext .getSessionFactory ()::getTypeConfiguration
5652
- );
5653
- }
5654
- else {
5655
- throw new SemanticException (
5656
- String .format (
5657
- Locale .ROOT ,
5658
- "Literal type '%s' did not match domain type '%s' nor converted type '%s'" ,
5659
- value .getClass (),
5660
- valueConverter .getDomainJavaType ().getJavaTypeClass ().getName (),
5661
- valueConverter .getRelationalJavaType ().getJavaTypeClass ().getName ()
5662
- )
5663
- );
5664
- }
5665
- return new QueryLiteral <>( sqlLiteralValue , basicValuedMapping );
5632
+ return new QueryLiteral <>( sqlLiteralValue ( valueConverter , literal .getLiteralValue () ), basicValuedMapping );
5666
5633
}
5667
5634
}
5668
5635
@@ -5779,6 +5746,40 @@ else if ( expressible instanceof EntityValuedModelPart ) {
5779
5746
}
5780
5747
}
5781
5748
5749
+ private <D > Object sqlLiteralValue (BasicValueConverter <D ,?> valueConverter , D value ) {
5750
+ // For converted query literals, we support both, the domain and relational java type
5751
+ if ( value == null || valueConverter .getDomainJavaType ().isInstance ( value ) ) {
5752
+ return valueConverter .toRelationalValue ( value );
5753
+ }
5754
+ else if ( valueConverter .getRelationalJavaType ().isInstance ( value ) ) {
5755
+ return value ;
5756
+ }
5757
+ else if ( Character .class .isAssignableFrom ( valueConverter .getRelationalJavaType ().getJavaTypeClass () )
5758
+ && value instanceof CharSequence && ( (CharSequence ) value ).length () == 1 ) {
5759
+ return ( (CharSequence ) value ).charAt ( 0 );
5760
+ }
5761
+ // In HQL, number literals might not match the relational java type exactly,
5762
+ // so we allow coercion between the number types
5763
+ else if ( Number .class .isAssignableFrom ( valueConverter .getRelationalJavaType ().getJavaTypeClass () )
5764
+ && value instanceof Number ) {
5765
+ return valueConverter .getRelationalJavaType ().coerce (
5766
+ value ,
5767
+ creationContext .getSessionFactory ()::getTypeConfiguration
5768
+ );
5769
+ }
5770
+ else {
5771
+ throw new SemanticException (
5772
+ String .format (
5773
+ Locale .ROOT ,
5774
+ "Literal type '%s' did not match domain type '%s' nor converted type '%s'" ,
5775
+ value .getClass (),
5776
+ valueConverter .getDomainJavaType ().getJavaTypeClass ().getName (),
5777
+ valueConverter .getRelationalJavaType ().getJavaTypeClass ().getName ()
5778
+ )
5779
+ );
5780
+ }
5781
+ }
5782
+
5782
5783
@ Override
5783
5784
public <N extends Number > Expression visitHqlNumericLiteral (SqmHqlNumericLiteral <N > numericLiteral ) {
5784
5785
final BasicValuedMapping inferredExpressible = (BasicValuedMapping ) getInferredValueMapping ();
@@ -7362,12 +7363,13 @@ private static <T extends Enum<T>> QueryLiteral<T> queryLiteral(
7362
7363
);
7363
7364
}
7364
7365
7366
+ @ SuppressWarnings ({"unchecked" , "rawtypes" })
7365
7367
@ Override
7366
7368
public Object visitFieldLiteral (SqmFieldLiteral <?> sqmFieldLiteral ) {
7367
- return new QueryLiteral <>(
7368
- sqmFieldLiteral .getValue (),
7369
- ( BasicValuedMapping ) determineValueMapping ( sqmFieldLiteral )
7370
- );
7369
+ final BasicValuedMapping valueMapping = ( BasicValuedMapping ) determineValueMapping ( sqmFieldLiteral );
7370
+ final Object value = sqmFieldLiteral .getValue ();
7371
+ final BasicValueConverter converter = valueMapping . getJdbcMapping (). getValueConverter ();
7372
+ return new QueryLiteral <>( converter != null ? sqlLiteralValue ( converter , value ) : value , valueMapping );
7371
7373
}
7372
7374
7373
7375
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0 commit comments