2121import java .util .function .Consumer ;
2222import java .util .function .Supplier ;
2323
24+ import org .checkerframework .checker .nullness .qual .Nullable ;
2425import static org .hibernate .internal .util .type .PrimitiveWrappers .canonicalize ;
2526
2627
@@ -38,6 +39,7 @@ public class JavaTypeRegistry implements JavaTypeBaseline.BaselineTarget, Serial
3839
3940 private final TypeConfiguration typeConfiguration ;
4041 private final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName = new ConcurrentHashMap <>();
42+ private final ConcurrentHashMap <Integer , ConcurrentHashMap <String , JavaType <?>>> typeCodeSpecificDescriptorsByTypeName = new ConcurrentHashMap <>();
4143
4244 public JavaTypeRegistry (TypeConfiguration typeConfiguration ) {
4345 this .typeConfiguration = typeConfiguration ;
@@ -75,9 +77,22 @@ private void performInjections(JavaType<?> descriptor) {
7577
7678 public void forEachDescriptor (Consumer <JavaType <?>> consumer ) {
7779 descriptorsByTypeName .values ().forEach ( consumer );
80+ typeCodeSpecificDescriptorsByTypeName .values ().forEach ( descriptorsByTypeName -> {
81+ descriptorsByTypeName .values ().forEach ( consumer );
82+ } );
7883 }
7984
8085 public void addDescriptor (JavaType <?> descriptor ) {
86+ addDescriptor ( descriptorsByTypeName , descriptor );
87+ }
88+
89+ public void addDescriptor (int sqlTypeCode , JavaType <?> descriptor ) {
90+ final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName =
91+ typeCodeSpecificDescriptorsByTypeName .computeIfAbsent ( sqlTypeCode , k -> new ConcurrentHashMap <>() );
92+ addDescriptor ( descriptorsByTypeName , descriptor );
93+ }
94+
95+ private void addDescriptor (ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName , JavaType <?> descriptor ) {
8196 final var old = descriptorsByTypeName .put ( descriptor .getJavaType ().getTypeName (), descriptor );
8297 if ( old != null ) {
8398 LOG .debugf (
@@ -99,15 +114,26 @@ public <T> JavaType<T> getDescriptor(Type javaType) {
99114 return (JavaType <T >) resolveDescriptor ( javaType );
100115 }
101116
102- public JavaType <?> findDescriptor (Type javaType ) {
117+ public @ Nullable JavaType <?> findDescriptor (Type javaType ) {
103118 return descriptorsByTypeName .get ( javaType .getTypeName () );
104119 }
105120
106- public <J > JavaType <J > findDescriptor (Class <J > javaClass ) {
121+ public @ Nullable JavaType <?> findDescriptor (int sqlTypeCode , Type javaType ) {
122+ final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName =
123+ typeCodeSpecificDescriptorsByTypeName .get ( sqlTypeCode );
124+ return descriptorsByTypeName .get ( javaType .getTypeName () );
125+ }
126+
127+ public <J > @ Nullable JavaType <J > findDescriptor (Class <J > javaClass ) {
107128 final var cached = descriptorsByTypeName .get ( javaClass .getTypeName () );
108129 return cached == null ? null : checkCached ( javaClass , cached );
109130 }
110131
132+ public <J > @ Nullable JavaType <J > findDescriptor (int sqlTypeCode , Class <J > javaType ) {
133+ //noinspection unchecked
134+ return (JavaType <J >) findDescriptor ( sqlTypeCode , (Type ) javaType );
135+ }
136+
111137 public <J > JavaType <J > resolveDescriptor (Class <? extends J > javaType , Supplier <JavaType <J >> creator ) {
112138 final String javaTypeName = javaType .getTypeName ();
113139 final var cached = descriptorsByTypeName .get ( javaTypeName );
@@ -135,8 +161,25 @@ private static boolean isCompatible(Class<?> givenClass, Class<?> cachedClass) {
135161 return cachedClass == canonicalize ( givenClass );
136162 }
137163
164+ public <J > JavaType <J > resolveDescriptor (int sqlTypeCode , Class <? extends J > javaType , Supplier <JavaType <J >> creator ) {
165+ final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName =
166+ typeCodeSpecificDescriptorsByTypeName .computeIfAbsent ( sqlTypeCode , k -> new ConcurrentHashMap <>() );
167+ //noinspection unchecked
168+ return (JavaType <J >) resolveDescriptor ( descriptorsByTypeName , javaType .getTypeName (), creator );
169+ }
170+
171+ public JavaType <?> resolveDescriptor (int sqlTypeCode , Type javaType , Supplier <JavaType <?>> creator ) {
172+ final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName =
173+ typeCodeSpecificDescriptorsByTypeName .computeIfAbsent ( sqlTypeCode , k -> new ConcurrentHashMap <>() );
174+ return resolveDescriptor ( descriptorsByTypeName , javaType .getTypeName (), creator );
175+ }
176+
138177 @ Deprecated (since = "7.2" , forRemoval = true ) // Can be private
139178 private JavaType <?> resolveDescriptor (String javaTypeName , Supplier <? extends JavaType <?>> creator ) {
179+ return resolveDescriptor ( descriptorsByTypeName , javaTypeName , creator );
180+ }
181+
182+ private JavaType <?> resolveDescriptor (ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName , String javaTypeName , Supplier <? extends JavaType <?>> creator ) {
140183 final var cached = descriptorsByTypeName .get ( javaTypeName );
141184 if ( cached != null ) {
142185 return cached ;
0 commit comments