Java.Hibernate.Medium.What are named queries and how do you define them?

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.

This entry was posted in Без рубрики. Bookmark the permalink.

Leave a Reply

Your email address will not be published.