使用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.策略的設(shè)置
package com.strategy;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentityGenerator;
import java.io.Serializable;
/**
* 自定義的主鍵生成策略,如果填寫了主鍵id,如果數(shù)據(jù)庫中沒有這條記錄,則新增指定id的記錄;否則更新記錄
*
* 如果不填寫主鍵id,則利用數(shù)據(jù)庫本身的自增策略指定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;
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Data JPA使用Sort進行排序(Using Sort)
本篇文章主要介紹了Spring Data JPA使用Sort進行排序(Using Sort),具有一定的參考價值,有興趣的可以了解一下2017-07-07
Spring Boot如何通過自定義注解實現(xiàn)日志打印詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何通過自定義注解實現(xiàn)日志打印的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
idea中解決maven包沖突的問題(maven helper)
這篇文章主要介紹了idea中解決maven包沖突的問題(maven helper),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12

