@@ -927,12 +927,17 @@ public void load(Object object, Object id) {
927927 fireLoad ( new LoadEvent ( id , object , this , getReadOnlyFromLoadQueryInfluencers () ), LoadEventListener .RELOAD );
928928 }
929929
930- private <T > void setMultiIdentifierLoadAccessOptions (FindOption [] options , MultiIdentifierLoadAccess <T > loadAccess ) {
930+ private <T > boolean setMultiIdentifierLoadAccessOptions (FindOption [] options , MultiIdentifierLoadAccess <T > loadAccess ) {
931931 CacheStoreMode storeMode = getCacheStoreMode ();
932932 CacheRetrieveMode retrieveMode = getCacheRetrieveMode ();
933933 LockOptions lockOptions = copySessionLockOptions ();
934934 int batchSize = -1 ;
935935 for ( FindOption option : options ) {
936+ if ( option instanceof FindBy findBy ) {
937+ if ( findBy == FindBy .NATURAL_ID ) {
938+ return true ;
939+ }
940+ }
936941 if ( option instanceof CacheStoreMode cacheStoreMode ) {
937942 storeMode = cacheStoreMode ;
938943 }
@@ -980,12 +985,17 @@ else if ( option instanceof RemovalsMode ) {
980985 loadAccess .with ( lockOptions )
981986 .with ( interpretCacheMode ( storeMode , retrieveMode ) )
982987 .withBatchSize ( batchSize );
988+
989+ return false ;
983990 }
984991
985992 @ Override
986993 public <E > List <E > findMultiple (Class <E > entityType , List <?> ids , FindOption ... options ) {
987994 final var loadAccess = byMultipleIds ( entityType );
988- setMultiIdentifierLoadAccessOptions ( options , loadAccess );
995+ final boolean isFindByNaturalId = setMultiIdentifierLoadAccessOptions ( options , loadAccess );
996+ if ( isFindByNaturalId ) {
997+ return findMultipleByNaturalId ( entityType , ids , options );
998+ }
989999 return loadAccess .multiLoad ( ids );
9901000 }
9911001
@@ -999,7 +1009,10 @@ public <E> List<E> findMultiple(EntityGraph<E> entityGraph, List<?> ids, FindOpt
9991009 case POJO -> byMultipleIds ( type .getJavaType () );
10001010 };
10011011 loadAccess .withLoadGraph ( rootGraph );
1002- setMultiIdentifierLoadAccessOptions ( options , loadAccess );
1012+ final boolean isFindByNaturalId = setMultiIdentifierLoadAccessOptions ( options , loadAccess );
1013+ if ( isFindByNaturalId ) {
1014+ throw new UnsupportedOperationException ( "Find by natural-id with entity-graph is not supported" );
1015+ }
10031016 return loadAccess .multiLoad ( ids );
10041017 }
10051018
@@ -2250,12 +2263,18 @@ protected static <T> void logIgnoringEntityNotFound(Class<T> entityClass, Object
22502263 }
22512264 }
22522265
2253- private <T > void setLoadAccessOptions (FindOption [] options , IdentifierLoadAccessImpl <T > loadAccess ) {
2266+ /// @return `true` if [FindBy#NATURAL_ID] was found
2267+ private <T > boolean setLoadAccessOptions (FindOption [] options , IdentifierLoadAccessImpl <T > loadAccess ) {
22542268 CacheStoreMode storeMode = getCacheStoreMode ();
22552269 CacheRetrieveMode retrieveMode = getCacheRetrieveMode ();
22562270 LockOptions lockOptions = copySessionLockOptions ();
22572271 for ( FindOption option : options ) {
2258- if ( option instanceof CacheStoreMode cacheStoreMode ) {
2272+ if ( option instanceof FindBy findBy ) {
2273+ if ( findBy == FindBy .NATURAL_ID ) {
2274+ return true ;
2275+ }
2276+ }
2277+ else if ( option instanceof CacheStoreMode cacheStoreMode ) {
22592278 storeMode = cacheStoreMode ;
22602279 }
22612280 else if ( option instanceof CacheRetrieveMode cacheRetrieveMode ) {
@@ -2305,13 +2324,18 @@ else if ( option instanceof FindMultipleOption findMultipleOption ) {
23052324 }
23062325 }
23072326 loadAccess .with ( lockOptions ).with ( interpretCacheMode ( storeMode , retrieveMode ) );
2327+
2328+ return false ;
23082329 }
23092330
23102331 @ Override
2311- public <T > T find (Class <T > entityClass , Object primaryKey , FindOption ... options ) {
2332+ public <T > T find (Class <T > entityClass , Object key , FindOption ... options ) {
23122333 final IdentifierLoadAccessImpl <T > loadAccess = byId ( entityClass );
2313- setLoadAccessOptions ( options , loadAccess );
2314- return loadAccess .load ( primaryKey );
2334+ final boolean isFindByNaturalId = setLoadAccessOptions ( options , loadAccess );
2335+ if ( isFindByNaturalId ) {
2336+ return findByNaturalId ( entityClass , key , options );
2337+ }
2338+ return loadAccess .load ( key );
23152339 }
23162340
23172341 @ Override
@@ -2323,7 +2347,10 @@ public <T> T find(EntityGraph<T> entityGraph, Object primaryKey, FindOption... o
23232347 case MAP -> byId ( type .getTypeName () );
23242348 case POJO -> byId ( type .getJavaType () );
23252349 };
2326- setLoadAccessOptions ( options , loadAccess );
2350+ final boolean isFindByNaturalId = setLoadAccessOptions ( options , loadAccess );
2351+ if ( isFindByNaturalId ) {
2352+ throw new UnsupportedOperationException ( "Find by natural-id with entity-graph is not supported" );
2353+ }
23272354 return loadAccess .withLoadGraph ( graph ).load ( primaryKey );
23282355 }
23292356
@@ -2395,7 +2422,10 @@ public Object find(String entityName, Object primaryKey) {
23952422 @ Override
23962423 public Object find (String entityName , Object primaryKey , FindOption ... options ) {
23972424 final IdentifierLoadAccessImpl <?> loadAccess = byId ( entityName );
2398- setLoadAccessOptions ( options , loadAccess );
2425+ final boolean isFindByNaturalId = setLoadAccessOptions ( options , loadAccess );
2426+ if ( isFindByNaturalId ) {
2427+ return findByNaturalId ( entityName , primaryKey , options );
2428+ }
23992429 return loadAccess .load ( primaryKey );
24002430 }
24012431
@@ -2408,7 +2438,12 @@ public <T> T findByNaturalId(Class<T> entityType, Object naturalId, FindOption..
24082438
24092439 private <T > void setOptions (FindOption [] options , SimpleNaturalIdLoadAccessImpl <T > access ) {
24102440 for ( FindOption option : options ) {
2411- if ( option instanceof LockMode lockMode ) {
2441+ if ( option instanceof FindBy findBy ) {
2442+ if ( findBy == FindBy .ID ) {
2443+ throw new IllegalArgumentException ( "Cannot use FindBy#ID with findByNaturalId" );
2444+ }
2445+ }
2446+ else if ( option instanceof LockMode lockMode ) {
24122447 access .with ( lockMode );
24132448 }
24142449 else if ( option instanceof LockModeType lockModeType ) {
@@ -2437,15 +2472,20 @@ public Object findByNaturalId(String entityName, Object naturalId, FindOption...
24372472 }
24382473
24392474 @ Override
2440- public <T > List <T > findMultipleByNaturalId (Class <T > entityType , List <Object > naturalIds , FindOption ... options ) {
2475+ public <T > List <T > findMultipleByNaturalId (Class <T > entityType , List <? > naturalIds , FindOption ... options ) {
24412476 final NaturalIdMultiLoadAccessStandard <T > access = (NaturalIdMultiLoadAccessStandard <T >) byMultipleNaturalId ( entityType );
24422477 setOptions ( options , access );
24432478 return access .multiLoad ( naturalIds );
24442479 }
24452480
24462481 private <T > void setOptions (FindOption [] options , NaturalIdMultiLoadAccessStandard <T > access ) {
24472482 for ( FindOption option : options ) {
2448- if ( option instanceof LockMode lockMode ) {
2483+ if ( option instanceof FindBy findBy ) {
2484+ if ( findBy == FindBy .ID ) {
2485+ throw new IllegalArgumentException ( "Cannot use FindBy#ID with findMultipleByNaturalId" );
2486+ }
2487+ }
2488+ else if ( option instanceof LockMode lockMode ) {
24492489 access .with ( lockMode );
24502490 }
24512491 else if ( option instanceof LockModeType lockModeType ) {
@@ -2479,7 +2519,7 @@ else if ( option instanceof OrderingMode orderingMode ) {
24792519 }
24802520
24812521 @ Override
2482- public List <Object > findMultipleByNaturalId (String entityName , List <Object > naturalIds , FindOption ... options ) {
2522+ public List <Object > findMultipleByNaturalId (String entityName , List <? > naturalIds , FindOption ... options ) {
24832523 final NaturalIdMultiLoadAccessStandard <Object > access = (NaturalIdMultiLoadAccessStandard <Object >) byMultipleNaturalId ( entityName );
24842524 setOptions ( options , access );
24852525 return access .multiLoad ( naturalIds );
0 commit comments