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
3940private final TypeConfiguration typeConfiguration ;
4041private final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName = new ConcurrentHashMap <>();
42+ private final ConcurrentHashMap <Integer , ConcurrentHashMap <String , JavaType <?>>> typeCodeSpecificDescriptorsByTypeName = new ConcurrentHashMap <>();
4143
4244public JavaTypeRegistry (TypeConfiguration typeConfiguration ) {
4345this .typeConfiguration = typeConfiguration ;
@@ -75,9 +77,22 @@ private void performInjections(JavaType<?> descriptor) {
7577
7678public void forEachDescriptor (Consumer <JavaType <?>> consumer ) {
7779descriptorsByTypeName .values ().forEach ( consumer );
80+ typeCodeSpecificDescriptorsByTypeName .values ().forEach ( descriptorsByTypeName -> {
81+ descriptorsByTypeName .values ().forEach ( consumer );
82+ } );
7883}
7984
8085public 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 ) {
8196final var old = descriptorsByTypeName .put ( descriptor .getJavaType ().getTypeName (), descriptor );
8297if ( old != null ) {
8398LOG .debugf (
@@ -99,15 +114,26 @@ public <T> JavaType<T> getDescriptor(Type javaType) {
99114return (JavaType <T >) resolveDescriptor ( javaType );
100115}
101116
102- public JavaType <?> findDescriptor (Type javaType ) {
117+ public @ Nullable JavaType <?> findDescriptor (Type javaType ) {
103118return 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 ) {
107128final var cached = descriptorsByTypeName .get ( javaClass .getTypeName () );
108129return 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+
111137public <J > JavaType <J > resolveDescriptor (Class <? extends J > javaType , Supplier <JavaType <J >> creator ) {
112138final String javaTypeName = javaType .getTypeName ();
113139final var cached = descriptorsByTypeName .get ( javaTypeName );
@@ -130,8 +156,25 @@ private static <J> JavaType<J> checkCached(Class<? extends J> javaClass, JavaTyp
130156return resolvedType ;
131157}
132158
159+ public <J > JavaType <J > resolveDescriptor (int sqlTypeCode , Class <? extends J > javaType , Supplier <JavaType <J >> creator ) {
160+ final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName =
161+ typeCodeSpecificDescriptorsByTypeName .computeIfAbsent ( sqlTypeCode , k -> new ConcurrentHashMap <>() );
162+ //noinspection unchecked
163+ return (JavaType <J >) resolveDescriptor ( descriptorsByTypeName , javaType .getTypeName (), creator );
164+ }
165+
166+ public JavaType <?> resolveDescriptor (int sqlTypeCode , Type javaType , Supplier <JavaType <?>> creator ) {
167+ final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName =
168+ typeCodeSpecificDescriptorsByTypeName .computeIfAbsent ( sqlTypeCode , k -> new ConcurrentHashMap <>() );
169+ return resolveDescriptor ( descriptorsByTypeName , javaType .getTypeName (), creator );
170+ }
171+
133172@ Deprecated (since = "7.2" , forRemoval = true ) // Can be private
134173private JavaType <?> resolveDescriptor (String javaTypeName , Supplier <? extends JavaType <?>> creator ) {
174+ return resolveDescriptor ( descriptorsByTypeName , javaTypeName , creator );
175+ }
176+
177+ private JavaType <?> resolveDescriptor (ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName , String javaTypeName , Supplier <? extends JavaType <?>> creator ) {
135178final var cached = descriptorsByTypeName .get ( javaTypeName );
136179if ( cached != null ) {
137180return cached ;
0 commit comments