You can define several named queries on an entity by using the @NamedQueries
and @NamedQuery
annotations. For each named query you need to define a name
and the jpql query
itself:
import javax.persistence.*; @Entity @Access(AccessType.FIELD) @Table(name = PartnerInitialLoad.TABLE_NAME) @NamedQueries({ @NamedQuery( name = FIND_MAX_PARTNERNUMMER, query = "select max(p.partnernummer) from PartnerInitialLoad p"), @NamedQuery( name = FIND_PARTNER_BY_STATUS, query = "select p from PartnerInitialLoad p where p.status = :status order by p.partnernummer asc") }) public class PartnerInitialLoad { public static final String TABLE_NAME = "T_PARTNER_INITIAL_LOAD"; public static final String FIND_MAX_PARTNERNUMMER = "findMaxPartnernummer"; public static final String FIND_PARTNER_BY_STATUS = "findPartnerByStatus"; public static final String PARAM_STATUS = "status"; //the value here has to match the one in jpql, here "status" // further entity details emitted for brevity }
Then use the named queries in your repository services. For that use the createNamedQuery
method of the EntityManager
,
which expects the name of the query you defined in the metadata, plus the type of the query result:
@Stateless public class PartnerInitialLoadRepository { @Inject private EntityManager em; public List<PartnerInitialLoad> getPartnersByStatus(Integer chunkSize, String status) { var query = em.createNamedQuery(PartnerInitialLoad.FIND_UNPROCESSED_PARTNER, PartnerInitialLoad.class); query.setParameter(PartnerInitialLoad.PARAM_STATUS, status); query.setMaxResults(chunkSize); return query.getResultList(); } public int getMaxPartnernummer() { var query = em.createNamedQuery(PartnerInitialLoad.FIND_MAX_PARTNERNUMMER, Integer.class); var singleResult = query.getSingleResult(); return singleResult == null ? 0 : singleResult; } }
Shared with ❤️ from Codever. Use 👉 copy to mine functionality to add it to your personal snippets collection.
Top comments (0)