package com.ankurm.hibernatedemo.namedquery; import static org.assertj.core.api.Assertions.assertThat; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; /** * Backs ankurm.com post 4877, docs/14-named-queries.md chapter "Named queries in orm.xml". */ @SpringBootTest class OrmXmlNamedQueryTest { private static final Logger DEMO = LoggerFactory.getLogger("DEMO"); @Autowired private EntityManagerFactory emf; @BeforeEach void cleanTable() { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); em.createQuery("DELETE FROM XmlQueryEmployee").executeUpdate(); em.getTransaction().commit(); em.close(); } @Test void namedQueryDefinedInOrmXml_worksAlongsideTheAnnotatedOne() { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); em.persist(new XmlQueryEmployee("Low", 30_000)); em.persist(new XmlQueryEmployee("High", 90_000)); em.getTransaction().commit(); List viaAnnotation = em.createNamedQuery("XmlQueryEmployee.findBySalaryAbove", XmlQueryEmployee.class) .setParameter("min", 50_000.0) .getResultList(); List viaXml = em.createNamedQuery("XmlQueryEmployee.findBySalaryAboveXml", XmlQueryEmployee.class) .setParameter("min", 50_000.0) .getResultList(); DEMO.info("annotation-defined named query result: {} rows", viaAnnotation.size()); DEMO.info("orm.xml-defined named query result: {} rows", viaXml.size()); assertThat(viaAnnotation).hasSize(1); assertThat(viaXml).hasSize(1); em.close(); } @Test void ormXmlNamedQuery_overridesTheSameNamedAnnotatedOne() { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); em.persist(new XmlQueryEmployee("Whoever", 60_000)); em.getTransaction().commit(); // The annotation on XmlQueryEmployee for "overridden" is deliberately wrong (salary < 0). // If orm.xml wins, this returns 1 row; if the annotation wins, it returns 0. List result = em.createNamedQuery("XmlQueryEmployee.overridden", XmlQueryEmployee.class) .setParameter("min", 50_000.0) .getResultList(); DEMO.info("XmlQueryEmployee.overridden (annotation says salary<0, orm.xml says salary>:min): {} rows", result.size()); assertThat(result) .as("orm.xml's definition must win over the annotation of the same name") .hasSize(1); em.close(); } }