From 5b8ef8ea10a16303410e7a27430e83eaf8ae865d Mon Sep 17 00:00:00 2001 From: Mic Date: Thu, 7 Feb 2013 09:25:30 +0800 Subject: [PATCH] replacing one Spring Data Repo with native JPA see https://jira.springsource.org/browse/DATAJPA-292 --- .../springdatajpa/JpaOwnerRepositoryImpl.java | 52 +++++++++++++++++++ .../SpringDataOwnerRepository.java | 20 ------- src/main/resources/{db => }/db_readme.txt | 0 .../spring/applicationContext-dao.xml | 3 ++ 4 files changed, 55 insertions(+), 20 deletions(-) create mode 100644 src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImpl.java delete mode 100644 src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java rename src/main/resources/{db => }/db_readme.txt (100%) diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImpl.java new file mode 100644 index 000000000..6e88ea019 --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImpl.java @@ -0,0 +1,52 @@ +package org.springframework.samples.petclinic.repository.springdatajpa; + +import java.util.Collection; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + +import org.springframework.samples.petclinic.Owner; +import org.springframework.samples.petclinic.repository.OwnerRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +/** + * Using native JPA here because of this query: + * "SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName" + * See https://jira.springsource.org/browse/DATAJPA-292 for more details. + * + * @author Michael Isvy + */ +@Repository +@Transactional +public class JpaOwnerRepositoryImpl implements OwnerRepository { + + @PersistenceContext + private EntityManager em; + + + @SuppressWarnings("unchecked") + public Collection findByLastName(String lastName) { + // using 'join fetch' because a single query should load both owners and pets + // using 'left join fetch' because it might happen that an owner does not have pets yet + Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName"); + query.setParameter("lastName", lastName + "%"); + return query.getResultList(); + } + + public Owner findById(int id) { + // using 'join fetch' because a single query should load both owners and pets + // using 'left join fetch' because it might happen that an owner does not have pets yet + Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id"); + query.setParameter("id", id); + return (Owner) query.getSingleResult(); + } + + + public void save(Owner owner) { + this.em.merge(owner); + + } + +} diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java deleted file mode 100644 index 655c8e743..000000000 --- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.springframework.samples.petclinic.repository.springdatajpa; - -import java.util.Collection; - -import org.springframework.dao.DataAccessException; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.Repository; -import org.springframework.samples.petclinic.Owner; -import org.springframework.samples.petclinic.repository.OwnerRepository; - -/** - * - * @author Michael Isvy - * @since 15.1.2013 - */ -public interface SpringDataOwnerRepository extends OwnerRepository, Repository { - - @Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName%") - Collection findByLastName(String lastName) throws DataAccessException; -} diff --git a/src/main/resources/db/db_readme.txt b/src/main/resources/db_readme.txt similarity index 100% rename from src/main/resources/db/db_readme.txt rename to src/main/resources/db_readme.txt diff --git a/src/main/resources/spring/applicationContext-dao.xml b/src/main/resources/spring/applicationContext-dao.xml index 89e79eb60..f74d0cf4c 100644 --- a/src/main/resources/spring/applicationContext-dao.xml +++ b/src/main/resources/spring/applicationContext-dao.xml @@ -117,6 +117,9 @@ + + + \ No newline at end of file