美文网首页SpringBoot
SpringBoot中JPA多表联合自定义查询@Query

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

作者: Briarbear | 来源:发表于2018-05-24 18:45 被阅读0次
    • 版权声明:本文为博主原创文章,转载请注明出处,谢谢。

    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;
        }
    }
    

    相关文章

      网友评论

        本文标题:SpringBoot中JPA多表联合自定义查询@Query

        本文链接:https://www.haomeiwen.com/subject/hbzsjftx.html