Prefacio
Introducción básica a los datos de primavera-JPA: la razón del nacimiento de JPA es integrar marcos de ORM de terceros y establecer un método estándar. La enciclopedia de Baidu dice que JDK se está desarrollando en esta dirección para lograr la unidad de ORM. Sin embargo, no se ha implementado completamente. En el marco ORM, Hibernate es un gran ejército, ampliamente utilizado, conveniente y tiene fuertes capacidades. Al mismo tiempo, Hibernate también está bien integrado con JPA. Podemos pensar que JPA es el estándar, y de hecho, JPA es casi todas las interfaces, y Hibernate realiza todas las implementaciones. Desde una perspectiva macro, Hibernate funciona muy bien bajo la unificación de JPA.
Recientemente, he estado usando SpringBoot y Spring Data JPA. El uso de JPA puede hacerme más conveniente para operar la base de datos, pero he encontrado muchas dificultades durante el uso. Grabaré el siguiente artículo. No diré mucho a continuación. Echemos un vistazo a la introducción detallada juntos.
Escena:
Consulta dinámica, consulta de paginación, consulta diferentes tablas de datos de acuerdo con diferentes estados aprobados y use MAP para convertir VO antes de pasar al objeto de página. Los diferentes lugares de uso de concorden afectan la corrección de los datos pagados, por lo que lo discutiremos.
premisa:
El objeto de página está encerrado en VO, y los datos de retorno incluyen datos pagados
@Apimodelproperty ("registro") Página privada <AdityRecordVo> ActivityRecordVolist; @apimodelproperty ("cantidad") privado entero num = 0; @apimodelproperty ("cantidad") private bigDecimal TotalMoney = bigDecimal.ValueOf (0);Aplicación incorrecta:
Lista <AdityRecordVo> ActivityRecordVolist = new ArrayList <> (); if (recibeEdRecordRequestVo.getSenDorReceivEtexy () == sendOrRECEIVETYPE.Receive) {list <HallengerEcord> challengerecordList = challengerecorddao.findbyuserIdandDeletetype (userId, deleteType.false); if (! collectionUtils.isEmpty (challengerecordList)) {ActivityRecordVolist = ChallengerCordList.stream () .map (this :: ChallengerCordToActivityRecordvo) .Collect (Collectors.tolist ()); }} else if (recibeEdRecordRequestVo.getSenDorReceIveteType () == SendOrRECEIVETYPE.SEND) {List <Adity> ActivityList = ActivityDao.FindbyUserIdAndDeletType (userId, deletetype.false); if (! collectionUtils.isEmpty (ActivityList)) {ActationRecordVolist = ActivityList.stream () .map (this :: ActivityToActivityRecordvo) .Collect (Collectors.tolist ()); }}ActivityReceivesEdRecordvo.SetActivityRecordVolist (nuevo PageImpl <> (ActivityRecordVolist, ACTIVITYRecordVolist.Size ()));
Análisis: El solo daños aprobado solo usa nueva página para convertir la lista en objeto de página cuando se establece en VO. Aunque el número total de páginas y el número total de líneas reportadas en el front-end es correcto, el número de líneas en la primera página es todo, ¡y los datos son anormales!
Método de referencia correcto:
Use las especificaciones para consultar dinámicamente y mapear el objeto de paginación correspondiente de acuerdo con las condiciones de consulta (este código de bloque varía según los requisitos). En este momento, el fallecido en Findall es efectivo, y se mostrará la información correcta de paginación.
Referencia de bloque de código:
xxxCommonspecutil es una clase de herramienta de especificación autoproclamada, similar al método de consulta nativa de datos de Spring Data Native Spring.
Page <AdityRecordvo> Page = new PageImpl <> (ActivityRecordVolist, Pagable, ActivityRecordVolist.Size ()); if (recibeDRECORDREQUESTVO.GetSENDORREIVETYPE () == sendOrReceivetype.Receive) {Especificaciones <ShallengerCord> Spec = Especificaciones.where (desafío (ChallengeMonsPeCutil.equal ("userId", userId)). y (desafío de desafío (eleCutil.equal.equal.equal.equal.equype ". Page = ChallengerecordDao.Findall (especificación, pagible) .map (this :: ChallengerCordToActivityRecordvo); } else if (recibeEdRecordRequestVo.getSenDorReceiveType () == sendOrReceiveType.send) {Especificaciones <Aptition> spec = especificaciones.where (ActivityCommonsPeCutil.equal ("UserId", UserId)) .AntCommonspeCutil.equal ("DeleteTetype", Deletetype)); Page = ActivityDao.Findall (Spec, HAGEABLE) .map (this :: ActivityToActivityRecordvo); }Nota: ActivityReceiveSendRecordvo está encapsulado VO, que contiene el objeto de página devuelto
ActivityReceiveSendRecordvo.SetActivityRecordVolist (Page);
Resumir
Después de usar Spring Data JPA durante tanto tiempo, creo que las especificaciones son muy útiles y no son propensas a los errores. También es mi estilo de codificación favorito. Sin embargo, generalmente uso el método simple y crudo de nuevo PageImpl <> () para consultar datos y asociar demasiadas tablas. Volveré directamente al final. ¡El nivel más profundo debe ser discutido nuevamente!
De acuerdo, lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.