ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Jpa动态查询新方式,超级简单(附录源码)

2022-01-26 16:59:23  阅读:177  来源: 互联网

标签:userName UserVo Jpa profession vo grade 源码 附录 id


1:项目结构图
在这里插入图片描述
2:TUser.java

/**
 * @Author ZGM
 * @DateTime 2021/12/31
 * @description
 */
@Data
@Entity
@Table(name = "t_user")
@AllArgsConstructor
@NoArgsConstructor
@DynamicUpdate
@DynamicInsert
public class TUser {
    @Id
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    @Column(name = "user_name")
    private String userName;

    @Column(name = "pass_word")
    @JsonIgnore
    private String passWord;

    @Column(name = "nick_name")
    private String nickName;

    @Column(name = "sex")
    private String sex;

    @Column(name = "age")
    private Integer age;

    @Column(name = "status")
    private String status;

    @Column(name = "create_time")
    private Date createTime;

    @Column(name = "update_time")
    private Date updateTime;

    @PreUpdate
    protected void onUpdate() {
        updateTime = new Date();
    }

    @PrePersist
    protected void onCreate() {
        createTime = new Date();
        updateTime = new Date();
    }

    @JsonIgnore
    @Version
    @Column(name = "version")
    private int version;

    @Column(name = "role")
    private String role;
}

3:UserInfo.java

@Data
@Entity
@Table(name = "user_info")
public class UserInfo {

	@Id
	@JsonSerialize(using = ToStringSerializer.class)
	private Long id;

	private String profession;

	private String grade;

	private String dormitory;

}

4:实体类对应的数据库接口
TUserRepository

@Repository
public interface TUserRepository extends JpaRepository<TUser, Long>, JpaSpecificationExecutor<TUser> {
}

UserInfoRepository

@Repository
public interface UserInfoRepository extends JpaRepository<UserInfo, Long>, JpaSpecificationExecutor<UserInfo> {
@Query(value = "select new com.example.vo.UserVo(info.id, user.userName, info.profession, info.grade) from UserInfo info left join TUser user on info.id = user.id" +
        " where ( info.profession = ?1 or ?1 is null) " +
        " and ( info.grade = ?2 or ?2 is null)")
Page<UserVo> allUser(String profession, String grade, Pageable pageable);
}

5: UserVo.java

@Data
@AllArgsConstructor
public class UserVo {
    Long id;
    String userName;
    String profession;
    String grade;
}

6: UserService.java

@Service
@RequiredArgsConstructor
@RefreshScope
public class UserService extends KeyGenService {
    private final UserInfoRepository infoRepository;
   
    public Page<UserVo> list(UserQueryVo vo){
        Pageable pageable = PageRequest.of(vo.getPage(),vo.getSize());
        return infoRepository.allUser(vo.getProfession(),vo.getGrade(), pageable);
    }

}

7: UserController.java

@RestController
@RequestMapping("/v1/user")
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;

    @PostMapping("/list")
    public Page<UserVo> list(@RequestBody UserQueryVo vo){
        return userService.list(vo);
    }
}

8:配置文件根据自己的情况编写即可,我这里用的是nacos配置中心注册的服务,因为我船舰的是微服务架构,UserService只是一个用户模块的服务
9:单元测试

@Test
    public void ervsd(){
        UserQueryVo vo = new UserQueryVo();
        vo.setPage(0);
        vo.setSize(15);
        System.out.println(userService.list(vo).getContent());
    }

结果:

[UserVo(id=123, userName=null, profession=null, grade=null), UserVo(id=575698132303290368, userName=17856419339, profession=计算机, grade=1704), UserVo(id=575716833031299072, userName=17856419331, profession=计算机, grade=1704), UserVo(id=576000665194274816, userName=17856419332, profession=计算机, grade=1703), UserVo(id=576000781602988032, userName=17856419333, profession=计算机, grade=1703), UserVo(id=576000899173523456, userName=17856419334, profession=计算机, grade=1702), UserVo(id=576001007231377408, userName=17856419335, profession=计算机, grade=1702), UserVo(id=576001227939848192, userName=17856419336, profession=计算机, grade=1701), UserVo(id=576001356105195520, userName=17856419337, profession=计算机, grade=1701), UserVo(id=576001504025714688, userName=17856419338, profession=计算机, grade=1701), UserVo(id=576001653640732672, userName=17856419310, profession=计算机, grade=1701), UserVo(id=576001828031504384, userName=17856419311, profession=计算机, grade=1704), UserVo(id=576337740011610112, userName=17856419312, profession=计算机, grade=1703)]
共13条数据,表里面也就13条,sql里要求了好多参数,我现在没传,它就默认没这个条件,即查询的是全部

现在加一些参数

@Test
    public void ervsd(){
        UserQueryVo vo = new UserQueryVo();
        vo.setPage(0);
        vo.setSize(15);
        vo.setProfession("计算机");
        vo.setGrade("1701");
        System.out.println(userService.list(vo).getContent());
    }

结果:

[UserVo(id=576001227939848192, userName=17856419336, profession=计算机, grade=1701), UserVo(id=576001356105195520, userName=17856419337, profession=计算机, grade=1701), UserVo(id=576001504025714688, userName=17856419338, profession=计算机, grade=1701), UserVo(id=576001653640732672, userName=17856419310, profession=计算机, grade=1701)]
共四条数据,出了分页参数,还加了两个条件专业和班级,它就自动加进去了,是不是很简洁

这种写法比传统的specification或者nativesql拼接字符串查询都要简洁,代码量少,通俗易懂。

标签:userName,UserVo,Jpa,profession,vo,grade,源码,附录,id
来源: https://blog.csdn.net/qq_44322586/article/details/122704538

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有