SpringBoot中JPA多表联合自定义查询@Query

SpringBoot中JPA多表联合自定义查询@Query

  • 版权声明:本文为博主原创文章,转载请注明出处,谢谢。
  • 其他相关文章见:个人博客站点:www.val1ant.xin


1. 实体类

本篇示例中,大致关系是一张博客文章表,一张标签表,一张博客与标签相关联表。示例代码中,均省略get、set方法及其他非必要内容

  • Blog.java-博客实体类,
@Entity
public class Blog {
    @Id
    @GeneratedValue
    private Integer id;
    @Lob
    @Column(columnDefinition="TEXT")  //匹配数据库的字段类型为text,适合长内容

}
  • Tag-标签实体类

@Entity
public class Tag {

    @Id
    @GeneratedValue
    private Integer id;
    private String name;
}
  • TagBlog-标签博客关联类
@Entity
public class TagBlog {

    @Id
    @GeneratedValue
    private Integer id;  //主键id

    private Integer tagId;  //标签id
    private Integer blogId;  //博客id
}

2. 数据库操作类

查询的任务为:联合标签博客表,统计每个标签的id、name、以及与该标签关联的博客文章数量,并且以对象集合的方式返回

1. 原生SQL查询

在复杂的查询情况下,经常会使用原生SQL语句,这个时候需要配合@Query中的nativeQuery,代码如下:

/**
 * 标签博客对应表操作持久化接口
 */
public interface TagBlogRepository extends JpaRepository<TagBlog,Integer> {

   @Query(nativeQuery = true,value = "select t.id,t.name,count(tb.id) as num from tag t inner join tag_blog tb on t.id = tb.tag_id group by t.id ") //原生SQL方法
    List<Object> selectAllTagView();

}
  • 在原生的sql语句中,count聚合函数的结果类型为BigInteger,在后续中不便于处理。
  • 注意:在原生的SQL语句中,查询的字段,表必须与数据库中对应,

2. 默认的JPQL方法

    @Query(value = "select t.id,t.name,count(l.id) as n from Tag t,TagBlog l where t.id = l.tagId group by t.id") //JPQL方法
    List<Object> selectAllTagView();
  • 在上述例子中,表名直接对应的Java的对象,字段也对应于属性值,书写的时候,注意直接去原生的SQL区别。
  • 如果是已存在对象Model,且字段属性相对应,还可以用下面的方式:
    @Query(value = "select new xin.val1ant.entity.Model(x1,x2,count(x3)) from ....")
    List<Model> selectAllTagView();

3. 数据处理类

为了得到特定的对象集合类,还需要对查询的结果进行处理

@Service
public class TagBlogServiceImpl implements ITagBlogService {


    @Autowired
    private TagBlogRepository tagBlogRepository;
    @Override
    public List<TagView> getAllTagView() {

        List<TagView> views = new ArrayList<>();
        List<Object> result = tagBlogRepository.selectAllTagView();
        for (Object o : result) {
            Object[] rowArray = (Object[]) o;
            TagView view = new TagView();
            view.setId((Integer) rowArray[0]);
            view.setName((String) rowArray[1]);
            Long count = (Long)rowArray[2];
            view.setNum(count.intValue());
            views.add(view);
        }

        return views;
    }
}
  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在Spring Boot使用JPA进行多表查询可以通过使用JPQL查询语句或者使用Spring Data JPA的关联查询来实现。 方法一:使用JPQL查询语句 1. 在实体类定义好表之间的关联关系,例如使用@ManyToOne、@OneToMany等注解。 2. 在Repository接口定义自定义查询方法,使用@Query注解指定JPQL查询语句。 3. 在Service层调用Repository查询方法进行查询操作。 示例代码: ```java @Entity @Table(name = "user") public class User { @Id private Long id; // 其他属性和关联关系省略... } @Entity @Table(name = "order") public class Order { @Id private Long id; @ManyToOne @JoinColumn(name = "user_id") private User user; // 其他属性和关联关系省略... } public interface OrderRepository extends JpaRepository<Order, Long> { @Query("SELECT o FROM Order o JOIN FETCH o.user WHERE o.id = :orderId") Order findOrderWithUserById(Long orderId); } ``` 方法二:使用Spring Data JPA的关联查询 1. 在实体类定义好表之间的关联关系,例如使用@ManyToOne、@OneToMany等注解。 2. 在Repository接口使用Spring Data JPA提供的关联查询方法进行查询操作。 示例代码: ```java @Entity @Table(name = "user") public class User { @Id private Long id; // 其他属性和关联关系省略... } @Entity @Table(name = "order") public class Order { @Id private Long id; @ManyToOne @JoinColumn(name = "user_id") private User user; // 其他属性和关联关系省略... } public interface OrderRepository extends JpaRepository<Order, Long> { Order findOrderById(Long orderId); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值