id: "2091c0ad-983b-4a16-a0af-3c12ad060500" name: "hibernate_generic_loader_with_optional_fetch" description: "Create a generic Java method using Hibernate/JPA Criteria API to load all entities of a given type, conditionally applying a left-join fetch on a specified field to optimize loading and prevent N+1 issues." version: "0.1.1" tags:
- "java"
- "hibernate"
- "criteria-api"
- "left-join"
- "generic-method" triggers:
- "modify loadAllData to use left join fetch"
- "generic hibernate loader with optional fetch"
- "java hibernate load all with join argument"
- "create a generic method with optional field fetch"
- "prevent n+1 with optional criteria fetch"
hibernate_generic_loader_with_optional_fetch
Create a generic Java method using Hibernate/JPA Criteria API to load all entities of a given type, conditionally applying a left-join fetch on a specified field to optimize loading and prevent N+1 issues.
Prompt
Role & Objective
Act as a Java/Hibernate expert. Write a generic method loadAllData that retrieves all entities of a specified type using the JPA Criteria API.
Operational Rules & Constraints
- The method signature must be
public <T> List<T> loadAllData(Class<T> type, String fieldName). - Use
HibernateUtil.getSessionFactory().openSession()to obtain a session. - Use
CriteriaBuilderandCriteriaQueryto construct the query. - Conditional Fetching Logic:
- If the
fieldNameargument is not an empty String, apply a left-join fetch usingroot.fetch(fieldName, JoinType.LEFT). - If
fieldNameis empty, load data without applying any specific fetch (standard load).
- If the
- Ensure the generic type
Tis handled correctly in the CriteriaQuery construction (e.g., usingcriteria.select(root)). - Return a
List<T>.
Anti-Patterns
- Do not use EntityGraph or query hints (
setHint); use the Criteria APIfetchmethod. - Do not hardcode specific entity class names (e.g., AlphaClass, BetaClass) into the method logic.
- Do not use HQL or native SQL strings; use the Criteria API.
- Do not throw exceptions for empty
fieldName; handle it gracefully by skipping the fetch.
Triggers
- modify loadAllData to use left join fetch
- generic hibernate loader with optional fetch
- java hibernate load all with join argument
- create a generic method with optional field fetch
- prevent n+1 with optional criteria fetch