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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JPA(Java Persistence API)允许开发者自定义生成策略。在JPA中,可以使用@GeneratedValue注解来指定的生成策略。常用的生成策略有以下几种: 1. 自长(GenerationType.IDENTITY):使用数据库自长字段生成,适用于支持自长的数据库,如MySQL、SQL Server等。 ```java @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ``` 2. 序列(GenerationType.SEQUENCE):使用数据库序列生成,适用于支持序列的数据库,如Oracle。 ```java @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_name") @SequenceGenerator(name = "sequence_name", sequenceName = "your_sequence_name", allocationSize = 1) private Long id; ``` 3. 表生成(GenerationType.TABLE):使用特定的数据库表来生成,适用于各种数据库。 ```java @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "table_name") @TableGenerator(name = "table_name", table = "your_table_name", pkColumnName = "pk_column_name", valueColumnName = "value_column_name", allocationSize = 1) private Long id; ``` 4. UUID(GenerationType.UUID):使用UUID生成,适用于分布式系统或无法依赖数据库自长功能的场景。 ```java @Id @GeneratedValue(strategy = GenerationType.UUID) private String id; ``` 以上是一些常用的生成策略,你可以根据实际需求选择适合的策略。同时,也可以通过实现自定义生成器来实现更加复杂的生成策略

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值