✅ Short Answer
Named queries are predefined, reusable JPQL or SQL queries associated with entity classes, given a unique name.
You define them using the @NamedQuery
or @NamedNativeQuery
annotations — or XML mappings — and later execute them by name in your code.
🔎 Detailed Explanation
🔹 Named JPQL Query
- Defined with
@NamedQuery
on an entity or package-level. - Written in JPQL/HQL — object-oriented query language using entity names and fields, not table/column names.
- Great for queries you’ll reuse frequently or want to keep in one central place.
- Defined once at startup → compiled and validated early → errors caught before runtime.
🔹 Benefits of named queries
✅ Reuse same query logic across your app.
✅ Centralized definition → easier maintenance.
✅ Early syntax validation → safer deployments.
🧑💻 Code Example: Named JPQL Query
@Entity
@NamedQuery(
name = "MyEntity.findByName",
query = "SELECT e FROM MyEntity e WHERE e.name = :name"
)
public class MyEntity {
@Id
private Long id;
private String name;
}
🔹 Usage:
Session session = sessionFactory.openSession();
List<MyEntity> results = session.createNamedQuery("MyEntity.findByName", MyEntity.class)
.setParameter("name", "Alice")
.getResultList();
session.close();
🧑💻 Code Example: Named Native Query
@Entity
@NamedNativeQuery(
name = "MyEntity.nativeFindByName",
query = "SELECT * FROM my_entity WHERE name = :name",
resultClass = MyEntity.class
)
public class MyEntity { /* ... */ }
🔹 Usage:
Session session = sessionFactory.openSession();
List<MyEntity> results = session.createNamedQuery("MyEntity.nativeFindByName", MyEntity.class)
.setParameter("name", "Bob")
.getResultList();
session.close();
📌 Key Takeaways
✅ Named queries let you define reusable JPQL or SQL queries tied to entity classes.
✅ Use @NamedQuery
for JPQL; use @NamedNativeQuery
for raw SQL.
✅ Calling session.createNamedQuery("queryName")
or entityManager.createNamedQuery()
lets you execute them by name.
✅ Named queries help with maintenance, readability, and early validation of query syntax.