使用JPA自定义id策略避免主键自增

 更新时间:2024年08月12日 09:18:02   作者:勉之~  
这篇文章主要介绍了使用JPA自定义id策略避免主键自增问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

JPA自定义id策略避免主键自增

1.实体Entity处理

/**
	 * 主键id
	 */
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "myid")
    @GenericGenerator(name = "myid",
            strategy = "com.strategy.ManulInsertGenerator")
   	@Column(name = "id" )
	private Long id;

2.策略的设置

package com.strategy;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentityGenerator;
import java.io.Serializable;

/**
 *  自定义的主键生成策略,如果填写了主键id,如果数据库中没有这条记录,则新增指定id的记录;否则更新记录
 *
 *  如果不填写主键id,则利用数据库本身的自增策略指定id
 *
 */
public class ManulInsertGenerator extends IdentityGenerator {

    @Override
    public Serializable generate(SharedSessionContractImplementor s, Object obj) throws HibernateException {
        Serializable id = s.getEntityPersister(null, obj).getClassMetadata().getIdentifier(obj, s);

        if (id != null && Integer.valueOf(id.toString()) > 0) {
            return id;
        } else {
            return super.generate(s, obj);
        }
    }
}

3.jpa多表分页处理

 @Override
   public List<RetUser> userPageList(ReqQueryUser input, String appKey) {
        QRoleEntity qRoleEntity = QRoleEntity.roleEntity;
        QHrGroupEntity qHrGroupEntity = QHrGroupEntity.hrGroupEntity;
        QUserRoleEntity qUserRoleEntity = QUserRoleEntity.userRoleEntity;
        QUserDeptEntity qUserDeptEntity = QUserDeptEntity.userDeptEntity;
        JPAQuery<UserEntity> query = jpaQueryFactory.selectFrom(qUserEntity)
                .leftJoin(qUserRoleEntity).on(qUserEntity.id.eq(qUserRoleEntity.userId)
                .and(qUserEntity.deleted.isFalse()).and(qUserRoleEntity.deleted.isFalse()).and(qUserRoleEntity.appKey.eq(appKey)))
                .leftJoin(qRoleEntity).on(qRoleEntity.id.eq(qUserRoleEntity.roleId)
                        .and(qRoleEntity.deleted.isFalse()).and(qUserRoleEntity.deleted.isFalse()).and(qUserRoleEntity.appKey.eq(appKey)))
                .leftJoin(qUserDeptEntity).on(qUserEntity.id.eq(qUserDeptEntity.userId)
                .and(qUserEntity.deleted.isFalse()).and(qUserDeptEntity.deleted.isFalse()).and(qUserDeptEntity.appKey.eq(appKey)))
                .leftJoin(qHrGroupEntity).on(qHrGroupEntity.id.eq(qUserDeptEntity.deptId)
                        .and(qHrGroupEntity.deleted.isFalse()).and(qUserDeptEntity.deleted.isFalse()).and(qUserDeptEntity.appKey.eq(appKey)))
                .orderBy(qUserEntity.id.asc());
        if (!CollectionUtils.isEmpty(input.getUserIds())) {
            query.where(qUserEntity.id.in(input.getUserIds()));
        }
        if (!StringUtils.isEmpty(input.getAdAccount())) {
            query.where(qUserEntity.adAccount.like("%" + input.getAdAccount() + "%"));
        }
        if (!StringUtils.isEmpty(input.getUserName())) {
            query.where(qUserEntity.userName.like("%" + input.getUserName() + "%"));
        }
        if (!StringUtils.isEmpty(input.getEmail())) {
            query.where(qUserEntity.email.eq(input.getEmail()));
        }
        if (!StringUtils.isEmpty(input.getMobile())) {
            query.where(qUserEntity.mobile.eq(input.getMobile()));
        }
        if (!StringUtils.isEmpty(input.getDeptName())) {
            query.where(qHrGroupEntity.groupName.like("%" + input.getDeptName() + "%"));
        }
        if (!StringUtils.isEmpty(input.getRoleName())) {
            query.where(qRoleEntity.roleName.like("%" + input.getRoleName() + "%"));
        }
        if (Objects.nonNull(input.getGender()) && input.getGender() == 0) {
            query.where(qUserEntity.gender.isFalse());
        }
        if (Objects.nonNull(input.getGender()) && input.getGender() == 1) {
            query.where(qUserEntity.gender.isTrue());
        }
        List<UserEntity> userEntities = query.select(Projections.bean(UserEntity.class,
                qUserEntity.id, qUserEntity.userName, qUserEntity.email,
                qUserEntity.adAccount, qUserEntity.mobile, qUserEntity.birthday,
                qUserEntity.createdAt, qUserEntity.createdBy, qUserEntity.currAppKey,
                qUserEntity.gender, qUserEntity.externalId, qUserEntity.disabled,
                qUserEntity.remark,qUserEntity.address,qUserEntity.headImage,qUserEntity.userNameEn,
                qRoleEntity.id.as("roleId"), qRoleEntity.roleName, qRoleEntity.roleCode,
                qHrGroupEntity.id.as("deptId"), qHrGroupEntity.groupName.as("deptName"),
                qHrGroupEntity.id.as("departmentId"), qHrGroupEntity.groupName.as("departmentName"))).fetch();
        //分页
        PageUtil.queryWithPaging(input.getPage(), query, qUserEntity);
        List<RetUser> retUserList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(userEntities)) {
            userEntities.forEach(userEntity -> {
                RetUser retUser = new RetUser();
                BeanUtils.copyProperties(userEntity, retUser);
                retUser.setGender(userEntity.getGender() == false ? 0 : 1);
                retUser.setStatus(userEntity.getDisabled() == false ? 0 : 1);
                retUserList.add(retUser);
            });
        }
        return retUserList;
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Data JPA使用Sort进行排序(Using Sort)

    Spring Data JPA使用Sort进行排序(Using Sort)

    本篇文章主要介绍了Spring Data JPA使用Sort进行排序(Using Sort),具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • Spring Shell打Jar包时常用小技巧

    Spring Shell打Jar包时常用小技巧

    这篇文章主要介绍了Spring Shell打Jar包时常用小技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot使用hutool操作FTP的详细过程

    SpringBoot使用hutool操作FTP的详细过程

    在使用SpringBoot结合hutool操作FTP时,遇到防火墙导致上传文件大小为0kb的问题,通过设置FTP为被动模式解决,本文详细解析了FTP的主动模式和被动模式的工作原理、安全性及适用场景,帮助理解FTP的连接方式和解决网络限制问题
    2024-09-09
  • java通过HTTP接收json详细实例代码

    java通过HTTP接收json详细实例代码

    Java作为一门广泛使用的编程语言,很多开发人员会用它来进行http请求,获取json数据,这篇文章主要给大家介绍了关于java通过HTTP接收json的相关资料,需要的朋友可以参考下
    2023-11-11
  • 一名Java高级工程师需要学什么?

    一名Java高级工程师需要学什么?

    作为一名Java高级工程师需要学什么?如何成为一名合格的工程师,这篇文章给了你较为详细的答案,需要的朋友可以参考下
    2017-08-08
  • 浅谈java中的TreeMap 排序与TreeSet 排序

    浅谈java中的TreeMap 排序与TreeSet 排序

    下面小编就为大家带来一篇浅谈java中的TreeMap 排序与TreeSet 排序。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • springboot启动时候报错mongodb问题

    springboot启动时候报错mongodb问题

    这篇文章主要介绍了springboot启动时候报错mongodb问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Spring Boot如何通过自定义注解实现日志打印详解

    Spring Boot如何通过自定义注解实现日志打印详解

    这篇文章主要给大家介绍了关于Spring Boot如何通过自定义注解实现日志打印的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • idea中解决maven包冲突的问题(maven helper)

    idea中解决maven包冲突的问题(maven helper)

    这篇文章主要介绍了idea中解决maven包冲突的问题(maven helper),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Java正则验证IP的方法实例分析【测试可用】

    Java正则验证IP的方法实例分析【测试可用】

    这篇文章主要介绍了Java正则验证IP的方法,结合实例形式对比分析了网上常见的几种针对IP的正则验证方法,最终给出了一个比较靠谱的IP正则验证表达式,需要的朋友可以参考下
    2017-08-08

最新评论