Spring Boot JPA多对一:按关联Category的title查询Gallery数据
解决根据Category标题查询Gallery的问题
首先得纠正你实体类里的一个小问题:Category中的@OneToMany关联应该是集合类型,毕竟一个分类对应多个Gallery,所以要把private Gallery gallery;改成private List<Gallery> galleries;,不然JPA映射会出问题:
@Entity(name="Category") @Table(name="categories") public class Category { @OneToMany(mappedBy="category") private List<Gallery> galleries; // 这里改为List集合 /* other code */ }
接下来给你几种在GalleryService的getGallery方法中实现需求的方案,你可以按需选择:
方案1:Spring Data JPA派生查询(最简洁)
直接在GalleryRepository里定义派生方法,Spring Data JPA会自动帮你生成查询语句:
先在Repository中添加方法:
@Repository("galleryRepository") public interface GalleryRepository extends JpaRepository<Gallery, Long>, SiteInfoCustomRepository { // 根据关联Category的title查询Gallery列表 List<Gallery> findByCategoryTitle(String title); }
然后在Service中调用:
@Override public List<Gallery> getGallery(String cat) { return galleryRepository.findByCategoryTitle(cat); }
方案2:自定义JPQL查询(更灵活)
如果需要更复杂的查询逻辑,可以用@Query注解写JPQL语句:
在Repository中添加:
@Query("SELECT g FROM Gallery g JOIN g.category c WHERE c.title = :categoryTitle") List<Gallery> findGalleryByCategoryTitle(@Param("categoryTitle") String categoryTitle);
Service层调用:
@Override public List<Gallery> getGallery(String cat) { return galleryRepository.findGalleryByCategoryTitle(cat); }
方案3:EntityManager手动实现查询
如果你坚持要用EntityManager来写,这里给你正确的写法,确保返回符合要求的Gallery列表:
首先在Service中注入EntityManager:
@Service public class GalleryService { @PersistenceContext private EntityManager em; private final GalleryRepository galleryRepository; // 构造函数注入Repository public GalleryService(GalleryRepository galleryRepository) { this.galleryRepository = galleryRepository; } @Override public List<Gallery> getGallery(String cat) { String jpql = "SELECT g FROM Gallery g JOIN g.category c WHERE c.title = :cat"; TypedQuery<Gallery> query = em.createQuery(jpql, Gallery.class); query.setParameter("cat", cat); return query.getResultList(); } }
这些方案都能帮你正确查询到对应分类标题下的Gallery数据,其中方案1是最贴合Spring Data JPA设计理念的,推荐优先使用。
内容的提问来源于stack exchange,提问作者Indrasis Datta
相关产品推荐
相关产品推荐

