@@ -928,12 +928,17 @@ public void load(Object object, Object id) {
928928 fireLoad ( new LoadEvent ( id , object , this , getReadOnlyFromLoadQueryInfluencers () ), LoadEventListener .RELOAD );
929929 }
930930
931- private <T > void setMultiIdentifierLoadAccessOptions (FindOption [] options , MultiIdentifierLoadAccess <T > loadAccess ) {
931+ private <T > boolean setMultiIdentifierLoadAccessOptions (FindOption [] options , MultiIdentifierLoadAccess <T > loadAccess ) {
932932 CacheStoreMode storeMode = getCacheStoreMode ();
933933 CacheRetrieveMode retrieveMode = getCacheRetrieveMode ();
934934 LockOptions lockOptions = copySessionLockOptions ();
935935 int batchSize = -1 ;
936936 for ( FindOption option : options ) {
937+ if ( option instanceof FindBy findBy ) {
938+ if ( findBy == FindBy .NATURAL_ID ) {
939+ return true ;
940+ }
941+ }
937942 if ( option instanceof CacheStoreMode cacheStoreMode ) {
938943 storeMode = cacheStoreMode ;
939944 }
@@ -981,12 +986,17 @@ else if ( option instanceof RemovalsMode ) {
981986 loadAccess .with ( lockOptions )
982987 .with ( interpretCacheMode ( storeMode , retrieveMode ) )
983988 .withBatchSize ( batchSize );
989+
990+ return false ;
984991 }
985992
986993 @ Override
987994 public <E > List <E > findMultiple (Class <E > entityType , List <?> ids , FindOption ... options ) {
988995 final var loadAccess = byMultipleIds ( entityType );
989- setMultiIdentifierLoadAccessOptions ( options , loadAccess );
996+ final boolean isFindByNaturalId = setMultiIdentifierLoadAccessOptions ( options , loadAccess );
997+ if ( isFindByNaturalId ) {
998+ return findMultipleByNaturalId ( entityType , ids , options );
999+ }
9901000 return loadAccess .multiLoad ( ids );
9911001 }
9921002
@@ -1000,7 +1010,10 @@ public <E> List<E> findMultiple(EntityGraph<E> entityGraph, List<?> ids, FindOpt
10001010 case POJO -> byMultipleIds ( type .getJavaType () );
10011011 };
10021012 loadAccess .withLoadGraph ( rootGraph );
1003- setMultiIdentifierLoadAccessOptions ( options , loadAccess );
1013+ final boolean isFindByNaturalId = setMultiIdentifierLoadAccessOptions ( options , loadAccess );
1014+ if ( isFindByNaturalId ) {
1015+ throw new UnsupportedOperationException ( "Find by natural-id with entity-graph is not supported" );
1016+ }
10041017 return loadAccess .multiLoad ( ids );
10051018 }
10061019
@@ -2251,12 +2264,18 @@ protected static <T> void logIgnoringEntityNotFound(Class<T> entityClass, Object
22512264 }
22522265 }
22532266
2254- private <T > void setLoadAccessOptions (FindOption [] options , IdentifierLoadAccessImpl <T > loadAccess ) {
2267+ /// @return `true` if [FindBy#NATURAL_ID] was found
2268+ private <T > boolean setLoadAccessOptions (FindOption [] options , IdentifierLoadAccessImpl <T > loadAccess ) {
22552269 CacheStoreMode storeMode = getCacheStoreMode ();
22562270 CacheRetrieveMode retrieveMode = getCacheRetrieveMode ();
22572271 LockOptions lockOptions = copySessionLockOptions ();
22582272 for ( FindOption option : options ) {
2259- if ( option instanceof CacheStoreMode cacheStoreMode ) {
2273+ if ( option instanceof FindBy findBy ) {
2274+ if ( findBy == FindBy .NATURAL_ID ) {
2275+ return true ;
2276+ }
2277+ }
2278+ else if ( option instanceof CacheStoreMode cacheStoreMode ) {
22602279 storeMode = cacheStoreMode ;
22612280 }
22622281 else if ( option instanceof CacheRetrieveMode cacheRetrieveMode ) {
@@ -2306,13 +2325,18 @@ else if ( option instanceof FindMultipleOption findMultipleOption ) {
23062325 }
23072326 }
23082327 loadAccess .with ( lockOptions ).with ( interpretCacheMode ( storeMode , retrieveMode ) );
2328+
2329+ return false ;
23092330 }
23102331
23112332 @ Override
2312- public <T > T find (Class <T > entityClass , Object primaryKey , FindOption ... options ) {
2333+ public <T > T find (Class <T > entityClass , Object key , FindOption ... options ) {
23132334 final IdentifierLoadAccessImpl <T > loadAccess = byId ( entityClass );
2314- setLoadAccessOptions ( options , loadAccess );
2315- return loadAccess .load ( primaryKey );
2335+ final boolean isFindByNaturalId = setLoadAccessOptions ( options , loadAccess );
2336+ if ( isFindByNaturalId ) {
2337+ return findByNaturalId ( entityClass , key , options );
2338+ }
2339+ return loadAccess .load ( key );
23162340 }
23172341
23182342 @ Override
@@ -2324,7 +2348,10 @@ public <T> T find(EntityGraph<T> entityGraph, Object primaryKey, FindOption... o
23242348 case MAP -> byId ( type .getTypeName () );
23252349 case POJO -> byId ( type .getJavaType () );
23262350 };
2327- setLoadAccessOptions ( options , loadAccess );
2351+ final boolean isFindByNaturalId = setLoadAccessOptions ( options , loadAccess );
2352+ if ( isFindByNaturalId ) {
2353+ throw new UnsupportedOperationException ( "Find by natural-id with entity-graph is not supported" );
2354+ }
23282355 return loadAccess .withLoadGraph ( graph ).load ( primaryKey );
23292356 }
23302357
@@ -2396,7 +2423,10 @@ public Object find(String entityName, Object primaryKey) {
23962423 @ Override
23972424 public Object find (String entityName , Object primaryKey , FindOption ... options ) {
23982425 final IdentifierLoadAccessImpl <?> loadAccess = byId ( entityName );
2399- setLoadAccessOptions ( options , loadAccess );
2426+ final boolean isFindByNaturalId = setLoadAccessOptions ( options , loadAccess );
2427+ if ( isFindByNaturalId ) {
2428+ return findByNaturalId ( entityName , primaryKey , options );
2429+ }
24002430 return loadAccess .load ( primaryKey );
24012431 }
24022432
@@ -2409,7 +2439,12 @@ public <T> T findByNaturalId(Class<T> entityType, Object naturalId, FindOption..
24092439
24102440 private <T > void setOptions (FindOption [] options , SimpleNaturalIdLoadAccessImpl <T > access ) {
24112441 for ( FindOption option : options ) {
2412- if ( option instanceof LockMode lockMode ) {
2442+ if ( option instanceof FindBy findBy ) {
2443+ if ( findBy == FindBy .ID ) {
2444+ throw new IllegalArgumentException ( "Cannot use FindBy#ID with findByNaturalId" );
2445+ }
2446+ }
2447+ else if ( option instanceof LockMode lockMode ) {
24132448 access .with ( lockMode );
24142449 }
24152450 else if ( option instanceof LockModeType lockModeType ) {
@@ -2438,15 +2473,20 @@ public Object findByNaturalId(String entityName, Object naturalId, FindOption...
24382473 }
24392474
24402475 @ Override
2441- public <T > List <T > findMultipleByNaturalId (Class <T > entityType , List <Object > naturalIds , FindOption ... options ) {
2476+ public <T > List <T > findMultipleByNaturalId (Class <T > entityType , List <? > naturalIds , FindOption ... options ) {
24422477 final NaturalIdMultiLoadAccessStandard <T > access = (NaturalIdMultiLoadAccessStandard <T >) byMultipleNaturalId ( entityType );
24432478 setOptions ( options , access );
24442479 return access .multiLoad ( naturalIds );
24452480 }
24462481
24472482 private <T > void setOptions (FindOption [] options , NaturalIdMultiLoadAccessStandard <T > access ) {
24482483 for ( FindOption option : options ) {
2449- if ( option instanceof LockMode lockMode ) {
2484+ if ( option instanceof FindBy findBy ) {
2485+ if ( findBy == FindBy .ID ) {
2486+ throw new IllegalArgumentException ( "Cannot use FindBy#ID with findMultipleByNaturalId" );
2487+ }
2488+ }
2489+ else if ( option instanceof LockMode lockMode ) {
24502490 access .with ( lockMode );
24512491 }
24522492 else if ( option instanceof LockModeType lockModeType ) {
@@ -2480,7 +2520,7 @@ else if ( option instanceof OrderingMode orderingMode ) {
24802520 }
24812521
24822522 @ Override
2483- public List <Object > findMultipleByNaturalId (String entityName , List <Object > naturalIds , FindOption ... options ) {
2523+ public List <Object > findMultipleByNaturalId (String entityName , List <? > naturalIds , FindOption ... options ) {
24842524 final NaturalIdMultiLoadAccessStandard <Object > access = (NaturalIdMultiLoadAccessStandard <Object >) byMultipleNaturalId ( entityName );
24852525 setOptions ( options , access );
24862526 return access .multiLoad ( naturalIds );
0 commit comments