使用JPA自定義id策略避免主鍵自增
更新時(shí)間:2024年08月12日 09:18:02 作者:勉之~
這篇文章主要介紹了使用JPA自定義id策略避免主鍵自增問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
JPA自定義id策略避免主鍵自增
1.實(shí)體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; /** * 自定義的主鍵生成策略,如果填寫(xiě)了主鍵id,如果數(shù)據(jù)庫(kù)中沒(méi)有這條記錄,則新增指定id的記錄;否則更新記錄 * * 如果不填寫(xiě)主鍵id,則利用數(shù)據(jù)庫(kù)本身的自增策略指定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多表分頁(yè)處理
@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(); //分頁(yè) 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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Data JPA使用Sort進(jìn)行排序(Using Sort)
本篇文章主要介紹了Spring Data JPA使用Sort進(jìn)行排序(Using Sort),具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07SpringBoot使用hutool操作FTP的詳細(xì)過(guò)程
在使用SpringBoot結(jié)合hutool操作FTP時(shí),遇到防火墻導(dǎo)致上傳文件大小為0kb的問(wèn)題,通過(guò)設(shè)置FTP為被動(dòng)模式解決,本文詳細(xì)解析了FTP的主動(dòng)模式和被動(dòng)模式的工作原理、安全性及適用場(chǎng)景,幫助理解FTP的連接方式和解決網(wǎng)絡(luò)限制問(wèn)題2024-09-09java通過(guò)HTTP接收json詳細(xì)實(shí)例代碼
Java作為一門(mén)廣泛使用的編程語(yǔ)言,很多開(kāi)發(fā)人員會(huì)用它來(lái)進(jìn)行http請(qǐng)求,獲取json數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于java通過(guò)HTTP接收json的相關(guān)資料,需要的朋友可以參考下2023-11-11springboot啟動(dòng)時(shí)候報(bào)錯(cuò)mongodb問(wèn)題
這篇文章主要介紹了springboot啟動(dòng)時(shí)候報(bào)錯(cuò)mongodb問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Spring Boot如何通過(guò)自定義注解實(shí)現(xiàn)日志打印詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何通過(guò)自定義注解實(shí)現(xiàn)日志打印的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10idea中解決maven包沖突的問(wèn)題(maven helper)
這篇文章主要介紹了idea中解決maven包沖突的問(wèn)題(maven helper),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Java正則驗(yàn)證IP的方法實(shí)例分析【測(cè)試可用】
這篇文章主要介紹了Java正則驗(yàn)證IP的方法,結(jié)合實(shí)例形式對(duì)比分析了網(wǎng)上常見(jiàn)的幾種針對(duì)IP的正則驗(yàn)證方法,最終給出了一個(gè)比較靠譜的IP正則驗(yàn)證表達(dá)式,需要的朋友可以參考下2017-08-08