• 吴裕雄天生自然Spring Boot@Query和@Modifying注解


    1.@Query注解
    使用@Query注解可以将JPQL语句直接定义在数据访问接口方法上,并且接口方法名不受查询关键字和关联查询命名规范约束。
    
    2.@Modifying注解
    可以使用@Modifying和@Query注解组合定义在数据访问接口方法上,进行更新查询操作。
    @Query注解
    
    public interface AuthorityRepository extends JpaRepository<Authority, Integer>{
        /**
         * 根据用户名查询用户所拥有的权限(关联查询)
         */
        @Query("select a from Authority a inner join a.userList u where u.username = ?1")
        public List<Authority> findByUserListUsername(String username);
    }
    /**
    * 根据作者id查询文章信息(标题和内容)
    */
    @Query("select new Map(a.title as title, a.content as content) from Article a where a.author.id = ?1 ")
    public List<Map<String, Object>> findTitleAndContentByAuthorId(Integer id);
    @Query("select a from Article a where a.author.aname = :aname1 and a.author.aname.id = :id1 ")
    public List<Article> findArticleByAuthorAnameAndId(@Param("aname1") String aname, @Param("id1") Integer id);
    @Modifying注解
    
        可以使用@Modifying和@Query注解组合定义在数据访问接口方法上,进行更新查询操作,示例代码如下:
         /**
         * 根据作者id删除作者
         */
        @Modifying
        @Query("delete from Author a where a.id = ?1")
        public int deleteAuthorByAuthorId(int id);
    @Query和@Modifying注解的使用方法
    
    1)创建持久化实体类
    2)创建数据访问层
    3)创建业务层
    4)创建控制器类
    5)运行
    1)创建持久化实体类
    
    创建名为com.ch.ch6_3.entity的包,并在该包中创建名为Article和Author的持久化实体类
    package com.ch.ch6_3.entity;
    
    import java.io.Serializable;
    import java.util.List;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
    
    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    
    @Entity
    @Table(name = "author_table")
    @JsonIgnoreProperties(value = { "hibernateLazyInitializer" })
    public class Author implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        // 作者名
        private String aname;
        // 文章列表,作者与文章是一对多的关系
        @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, targetEntity = Article.class, fetch = FetchType.LAZY)
        private List<Article> articleList;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getAname() {
            return aname;
        }
    
        public void setAname(String aname) {
            this.aname = aname;
        }
    
        public List<Article> getArticleList() {
            return articleList;
        }
    
        public void setArticleList(List<Article> articleList) {
            this.articleList = articleList;
        }
    }
    package com.ch.ch6_3.entity;
    
    import java.io.Serializable;
    
    import javax.persistence.Basic;
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.Lob;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
    import javax.validation.constraints.NotEmpty;
    import javax.validation.constraints.Size;
    
    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    
    @Entity
    @Table(name = "article_table")
    @JsonIgnoreProperties(value = { "hibernateLazyInitializer" })
    public class Article implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
    
        // 标题
        @NotEmpty(message = "标题不能为空")
        @Size(min = 2, max = 50)
        @Column(nullable = false, length = 50)
        private String title;
    
        // 文章内容
        @Lob // 大对象,映射 为MySQL的Long文本类型
        @Basic(fetch = FetchType.LAZY)
        @NotEmpty(message = "内容不能为空")
        @Size(min = 2)
        @Column(nullable = false)
        private String content;
    
        // 所属作者,文章与作者是多对一的关系
        @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
        // 可选属性optional=false,表示author不能为空。删除文章,不影响用户
        @JoinColumn(name = "id_author_id") // 设置在article表中的关联字段(外键)
        @JsonIgnore
        private Author author;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public Author getAuthor() {
            return author;
        }
    
        public void setAuthor(Author author) {
            this.author = author;
        }
    }
    2)创建数据访问层
    
    创建名为com.ch.ch6_3.repository的包,并在该包中创建名为ArticleRepository和AuthorRepository的接口。
    public interface ArticleRepository extends JpaRepository<Article, Integer>{
        /**
         * 根据作者id查询文章信息(标题和内容)
         */
        @Query("select new Map(a.title as title, a.content as content) from Article a where a.author.id = ?1 ")
        public List<Map<String, Object>> findTitleAndContentByAuthorId(Integer id);
        /**
         * 根据作者名和作者id查询文章信息
         */
        @Query("select a from Article a where a.author.aname = :aname1 and a.author.id = :id1 ")
        public List<Article> findArticleByAuthorAnameAndId(@Param("aname1") String aname, @Param("id1") Integer id);
    }
    package com.ch.ch6_3.repository;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Modifying;
    import org.springframework.data.jpa.repository.Query;
    
    import com.ch.ch6_3.entity.Author;
    
    public interface AuthorRepository extends JpaRepository<Author, Integer> {
        /**
         * 根据文章标题包含的内容,查询作者(关联查询)
         */
        @Query("select a from Author a  inner join  a.articleList t where t.title like %?1%")
        public Author findAuthorByArticleListtitleContaining(String title);
    
        /**
         * 根据作者id删除作者
         */
        @Modifying
        @Query("delete from Author a where a.id = ?1")
        public int deleteAuthorByAuthorId(int id);
    }
    package com.ch.ch6_3.repository;
    
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.query.Param;
    
    import com.ch.ch6_3.entity.Article;
    
    public interface ArticleRepository extends JpaRepository<Article, Integer> {
        /**
         * 根据作者id查询文章信息(标题和内容)
         */
        @Query("select new Map(a.title as title, a.content as content) from Article a where a.author.id = ?1 ")
        public List<Map<String, Object>> findTitleAndContentByAuthorId(Integer id);
    
        /**
         * 根据作者名和作者id查询文章信息
         */
        @Query("select a from Article a where a.author.aname = :aname1 and a.author.id = :id1 ")
        public List<Article> findArticleByAuthorAnameAndId(@Param("aname1") String aname, @Param("id1") Integer id);
    }
    3)创建业务层
    
    创建名为com.ch.ch6_3.service的包,并在该包中创建名为AuthorAndArticleService的接口和接口实现类AuthorAndArticleServiceImpl。
    package com.ch.ch6_3.service;
    
    import java.util.List;
    import java.util.Map;
    
    import com.ch.ch6_3.entity.Article;
    import com.ch.ch6_3.entity.Author;
    
    public interface AuthorAndArticleService {
        public List<Map<String, Object>> findTitleAndContentByAuthorId(Integer id);
    
        public List<Article> findArticleByAuthorAnameAndId(String aname, Integer id);
    
        public Author findAuthorByArticleListtitleContaining(String title);
    
        public int deleteAuthorByAuthorId(int id);
    }
    package com.ch.ch6_3.service;
    
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.ch.ch6_3.entity.Article;
    import com.ch.ch6_3.entity.Author;
    import com.ch.ch6_3.repository.ArticleRepository;
    import com.ch.ch6_3.repository.AuthorRepository;
    
    @Service
    @Transactional
    public class AuthorAndArticleServiceImpl implements AuthorAndArticleService {
        @Autowired
        private AuthorRepository authorRepository;
        @Autowired
        private ArticleRepository articleRepository;
    
        @Override
        public List<Map<String, Object>> findTitleAndContentByAuthorId(Integer id) {
            return articleRepository.findTitleAndContentByAuthorId(id);
        }
    
        @Override
        public List<Article> findArticleByAuthorAnameAndId(String aname, Integer id) {
            return articleRepository.findArticleByAuthorAnameAndId(aname, id);
        }
    
        @Override
        public Author findAuthorByArticleListtitleContaining(String title) {
            return authorRepository.findAuthorByArticleListtitleContaining(title);
        }
    
        @Override
        public int deleteAuthorByAuthorId(int id) {
            return authorRepository.deleteAuthorByAuthorId(id);
        }
    }
    4)创建控制器类
    
    创建com.ch.ch6_3.controller的包,并在该包中创建名为TestOneToManyController的控制器类。
    package com.ch.ch6_3.controller;
    
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.ch.ch6_3.entity.Article;
    import com.ch.ch6_3.entity.Author;
    import com.ch.ch6_3.service.AuthorAndArticleService;
    
    @RestController
    public class TestOneToManyController {
        @Autowired
        private AuthorAndArticleService authorAndArticleService;
    
        @RequestMapping("/findTitleAndContentByAuthorId")
        public List<Map<String, Object>> findTitleAndContentByAuthorId(Integer id) {
            return authorAndArticleService.findTitleAndContentByAuthorId(id);
        }
    
        @RequestMapping("/findArticleByAuthorAnameAndId")
        public List<Article> findArticleByAuthorAnameAndId(String aname, Integer id) {
            return authorAndArticleService.findArticleByAuthorAnameAndId(aname, id);
        }
    
        @RequestMapping("/findAuthorByArticleListtitleContaining")
        public Author findAuthorByArticleListtitleContaining(String title) {
            return authorAndArticleService.findAuthorByArticleListtitleContaining(title);
        }
    
        @RequestMapping("/deleteAuthorByAuthorId")
        public int deleteAuthorByAuthorId(int id) {
            return authorAndArticleService.deleteAuthorByAuthorId(id);
        }
    }
    首先,运行Ch63Application主类。然后,通过“http://localhost:8089/ch6_3/findTitleAndContentByAuthorId?id=1”查询作者id为1的文章标题和内容。
    package com.ch.ch6_3;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Ch63Application {
        public static void main(String[] args) {
            SpringApplication.run(Ch63Application.class, args);
        }
    }

  • 相关阅读:
    Java Review (十七、面向对象----枚举类)
    Java Review (十六、面向对象----Lambda 表达式)
    Java Review (十五、面向对象----内部类)
    Java Review (十四、面向对象----接口)
    Java Review (十三、面向对象----抽象类)
    Java Review (十二、面向对象----final 修饰符)
    Java Review (十一、面向对象----多态)
    Java Review (十、面向对象----继承)
    Java Review (九、面向对象----封装)
    Java Review (八、面向对象----成员变量和局部变量)
  • 原文地址:https://www.cnblogs.com/tszr/p/15338791.html
Copyright © 2020-2023  润新知