Prefácio
Introdução básica ao Spring-Data-JPA: O motivo do nascimento do JPA é integrar estruturas ORM de terceiros e estabelecer um método padrão. A Enciclopédia Baidu diz que o JDK está se desenvolvendo nessa direção para alcançar a unidade do ORM. No entanto, não foi totalmente implementado. Na estrutura do ORM, o Hibernate é um grande exército, amplamente utilizado, conveniente e tem fortes capacidades. Ao mesmo tempo, o Hibernate também está bem integrado ao JPA. Podemos pensar que o JPA é o padrão e, de fato, o JPA é quase todas as interfaces, e as implementações são todas feitas pelo hibernado. De uma perspectiva macro, o Hibernate opera muito bem sob a unificação do JPA.
Recentemente, tenho usado o Springboot e Spring Data JPA. O uso do JPA pode me tornar mais conveniente para operar o banco de dados, mas encontrei muitas armadilhas durante o uso. Vou gravar o seguinte artigo. Não vou dizer muito abaixo. Vamos dar uma olhada na introdução detalhada juntos.
Cena:
Consulta dinâmica, consulta de paginação, consulte diferentes tabelas de dados de acordo com diferentes estados passados e use o mapa para converter VO antes de passar no objeto da página. Os diferentes locais de uso do pagável afetam a correção dos dados da Pagada, por isso discutiremos isso.
premissa:
O objeto da página está entre a VO e os dados de retorno incluem dados paginados
@ApimodelProperty ("registro") Página privada <CivittionRecordvo> AtividadeRecordVolist; @apimodelProperty ("Quantity") Inteiro privado num = 0; @apimodelProperty ("valor") private bigdecimal totalMoney = bigDecimal.valueof (0);Aplicação incorreta:
List <CutivityRecordVo> ActivityRecordVolist = new ArrayList <> (); if (recebendrecordRequestvo.getSendorreCeivetype () == sendorreCeivetype.receive) {list <liberngerCord> ChallengerCordList = ChallengerCorddao.findByUserIDAndDeleteType (userId, deleteType.false); if (! collectionUtils.IsEmpty (ChallengerCordList)) {ActivityRecordVolist = ChallengerCordList.Stream () .Map (this :: ChallengerCordToActivityRecordvo) .Collect (Collectors.Tolist ()); }} else if (receberendRecordRequestvo.getSendorreCeivetype () == sendorreCeivetype.send) {list <ctivity> ActivityList = ActivityDao.findByUserIDAndDeleTeType (UserID, deleteType.false); if (! collectionUtils.IsEmpty (AtividadeList)) {ActivityRecordVolist = ActivityList.Stream () .Map (this :: ActivityToActivityRecordvo) .Collect (Collectors.Tolist ()); }}ActivityReceiveIVENDRecordvo.SetActivityRecordVolist (new PageImpl <> (ActivityRecordVolist, Pagable, ActivityRecordVolist.size ()));
Análise: O pagável aprovado apenas usa o novo PageIML para converter a lista em objeto de página quando definido como VO. Embora o número total de páginas e o número total de linhas relatadas no front-end esteja correto, o número de linhas na primeira página é tudo, e os dados são anormais!
Método de referência correto:
Use as especificações para consultar e mapear dinamicamente o objeto de paginação correspondente de acordo com as condições da consulta (esse código de bloco varia de acordo com os requisitos). Neste momento, o pagamento passado em Findall é eficaz e as informações corretas de paginação serão exibidas.
Referência de bloco de código:
XXXCommonspeCutil é uma classe de ferramentas de especificação autoproclamada, semelhante ao método de consulta nativo de dados nativos da mola JPA.
Página <TivityRecordVo> página = new PageImpl <> (ActivityRecordVolist, Pagable, ActivityRecordVolist.size ()); if (recebendRecordRequestvo.getSendorreCeivetype () == sendorreCeivetype.receive) {Especificações <HiflenGenErCord> spec = specifications.where (desafioMonsPecutil.Equal ("userID", userID). e (desafioMonsPecutil.Equal (delimetype "; Page = ChallengerCorddao.findall (Spec, pagável) .Map (this :: ChallengerCordToActivityRecordvo); } else if (recebendrecordRequestvo.getSendorreCeIVEType () == sendReCeivetype.send) {Especificações <Tivivity> specs = specifications.where (atividadeCommonsPecutil.Equal ("UserID", UserID)) .e (ATIVIL). página = atividadeDao.findall (Spec, pagável) .MAP (this :: AttivityToActivityRecordvo); }NOTA: AtividadeReceiveSendRecordvo está encapsulado VO, que contém o objeto de página retornado
ActivityReceiveIVENDRecordvo.SetActivityRecordVolist (Page);
Resumir
Depois de usar o Spring Data JPA por tanto tempo, acho que as especificações são muito úteis e não propensas a erros. É também o meu estilo de codificação favorito. No entanto, geralmente uso o método simples e grosseiro de novo PageImpl <> () para consultar dados e associar muitas tabelas. Voltarei diretamente no final. O nível mais profundo precisa ser discutido novamente!
Ok, o acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.