O JPA suporta duas maneiras de expressar consultas para recuperar entidades e outros dados persistentes do banco de dados: declarações de consulta (Java Persistence Query Language, JPQL) e API de critérios (API de critérios). O JPQL é uma instrução de consulta independente de banco de dados que é usada para operar modelos de entidade lógica, em vez de modelos de dados físicos. A API condicional é criar condições de consulta com base no modelo de entidade
1. Começando com declarações de consulta persistentes Java
A cópia do código é a seguinte: List <Soper> PESSONS = entityManager.CreateQuery ("Selecione P da Pessoa P"). GetResultList ();
1. Esta declaração de consulta é semelhante ao SQL. Mas a diferença entre ele e o SQL real é que, em vez de fazer uma consulta de seleção a partir de uma tabela, ela especifica a entidade do modelo de domínio do aplicativo.
2. A cláusula de seleção de consulta lista apenas o alias da entidade de consulta. Se você consultar apenas uma determinada coluna, poderá usar o operador DOT (.) Para navegar pelas propriedades da entidade. Como mostrado abaixo:
A cópia do código é a seguinte: List <String> PESSONS = EntityManager.CreateQuery ("Selecione P.Firstname da Pessoa P"). GetResultList ();
1.1. Critérios de filtro
Como o SQL, o JPQL também suporta onde cláusulas, que são usadas para filtrar os critérios de pesquisa. Inclui a maioria dos operadores, como: em, entre, como, substring de expressão de função, comprimento, etc.
A cópia do código é a seguinte: List <Soper> PESSONS = entityManager.CreateQuery ("Selecione P da Pessoa P onde P.age> 23"). GetResultList ();
1.2. Resultados da projeção
Se a quantidade de dados consultados for relativamente grande, você poderá usar a projeção para consultar apenas colunas úteis.
A cópia do código é a seguinte:/Lista de projetos <ject> pessoas = entityManager.CreateQuery ("Selecione P.FirstName, P.age da Pessoa P"). GetResultList ();
1.3. Consulta de agregação
A sintaxe de consulta agregada do JPQL é semelhante ao SQL. Por exemplo, contagem
A cópia do código é a seguinte: Lista <Teger> count = entityManager.createQuery ("Selecione contagem (p) da pessoa P"). GetResultList ();
1.4. Parâmetros de consulta
O JPQL suporta dois tipos de sintaxe de ligação de parâmetros.
1. Representação do parâmetro de posição
Onde o parâmetro é indicado na sequência de consultas, que é o número que segue o parâmetro imediatamente após um ponto de interrogação (?). Ao executar uma consulta, o desenvolvedor especifica os parâmetros que devem ser substituídos
Query Query = entityManager.CreateQuery ("Selecione P da Pessoa P onde P.age =? 1 e P.FirstName =? 2"); query.setParameter (1,21); query.setParameter (2, "Jack"); 2. Notação de parâmetro nomeada
Seguindo um cólon (:) e indicando -o na sequência de consultas, o desenvolvedor especifica o nome do parâmetro que deve ser substituído ao executar a consulta
Query Query = entityManager.CreateQuery ("Selecione P da Pessoa P onde P.age =: Age e P.FirstName =: Nome"); query.setParameter ("Age", 21); query.setParameter ("Nome", "Jack");2. Defina a consulta
O JPA fornece interfaces de consulta e tipedQuery (introduzido pelo JPA 2.0) para configurar e executar consultas. A consulta retorna o tipo de objeto, enquanto tipedQuery retorna o tipo de classe especificado.
// nenhum tipo especificado, retornar tipo de objeto consulta q = entityManager.CreateQuery ("Selecione P de Pessoa P"); // Especifique o tipo de retorno como tipo de pessoa tipedQuery <sesson> q1 = entityManager.CreateQuery ("Selecione P da pessoa P", Person.class);2.1. Definição de consulta dinâmica
O mecanismo de consulta JPA pode analisar as seqüências JPQL em árvores de sintaxe, obter os metadados dos mapas de objetos de entidade nas expressões e, em seguida, gerar SQL equivalente. Portanto, existem duas maneiras de realizar consultas dinâmicas.
1.Split String Método
Dica: causará problemas de injeção de SQL
/ * * retornar queryql;} // Chamada Query Query = entityManager.CreateQuery (QueryPersonJpql ("Jack", 21)); 2. Construção parametrizada dinâmica de condições de consulta (recomendado)
/ * * retornar queryql;} Query Query = entityManager.CreateQuery (QueryPersonjpqlbyparams ()); query.setParameter ("Nome", "Jack"); query.setParameter ("Age", 21);2.2. Definição de consulta nomeada
A Query nomeada é uma ferramenta poderosa. Use a anotação @NamedQuery para definir uma consulta nomeada que pode ser colocada na definição de classe de qualquer entidade. Esta anotação define o nome da consulta e seu texto.
Dica: a consulta nomeada é colocada na classe de entidade correspondente ao resultado da consulta
@Entity@nomeado (name = "findbyage", query = "selecione P da pessoa P onde P.age =: Age")
O nome definido na dica: o nome do nome do nome precisa ser único em toda a unidade de persistência; caso contrário, haverá um erro na operação.
por exemplo:
A cópia do código é a seguinte:
Exceção no thread "main" org.hibernate.DUplicatemappingException: Duplicate consulta mapeando o findbyage em org.hibernate.boot.internal.inflightmetadatacollectorimpl.checkQueryName
Chamar
A cópia do código é a seguinte:
List <Pesso> People = entityManager.CreatEnamedQuery ("FindByage", Person.class) .SetParameter ("Age", 21) .GetResultList ();
Se uma classe define duas ou mais consultas nomeadas, ela deve ser colocada em @NamedQueries ()
2.3. Parâmetros de ligação
Através do exemplo anterior, podemos ver que existem duas maneiras de vincular parâmetros: 1. Ligação da parametrização de posição. 2. Nome parametrizou a ligação. Todos estão ligados através do método setParameter da interface de consulta.
1. Parametrização de posição
TypedQuery <x> setParameter (posição int, valor do objeto);
2. Parametrização do nome
TypeDQuery <X> setParameter (nome da string, valor do objeto);
O primeiro é a ligação parametrizada de posição. Se a posição mudar, o código ligado precisará ser alterado. O segundo tipo é recomendado.
2.4. Execute a consulta
A interface de consulta e a interface tipedQuery fornecem três maneiras diferentes de executar consultas.
1.ExecuteUpdate
Usado para executar atualizações ou exclusão em lote
2.GetSingleResult
Obtenha um único conjunto de resultados. Se nenhum dado for obtido, uma NoresultException será lançada. Se vários dados forem obtidos, uma não -uniquieResultException será lançada
3.GetResultList
Obtenha o conjunto de resultados correspondente e especifique a ordem do conjunto. A lista precisa ser usada como o tipo de valor de retorno. Se nenhum dados for obtido, um conjunto vazio será retornado e nenhuma exceção será lançada
2.5. Paginação
A consulta de paginação pode ser concluída através dos métodos setFirstresult () e setMaxResults ()
O número da página de consulta é 0 e 2 dados são exibidos em cada página
A cópia do código é a seguinte:
List <Pesso> People = entityManager.CreateQuery ("Selecione P de Pessoa P", Pessoa.class) .SetFirstResult (0) .SetMaxResults (2) .GetResultList ();
Dica: não pode ser usada para consultas conectadas pelos relacionamentos de coleção, porque essas consultas podem retornar valores duplicados.
2.6. Tempo limite da consulta
Se um aplicativo precisar definir um limite no tempo de resposta da consulta, você poderá definir a propriedade Javax.persistence.Query.Timeout na consulta (introduzida pelo JPA 2.0) ou usá -lo como parte da propriedade de persistência. Esta propriedade define o número de == milissegundos permitidos para executar antes da consulta ser encerrada. Se o tempo limite da consulta, uma querytimeoutException será lançada.
TypeDQuery <SOYS> Query = entityManager.CreateQuery ("Selecione P de Pessoa P", Pessoa.class); // A unidade é milissegundos javax.persistence.query.TimeoutQuery.Sethint ("Javax.perSistence.Queryout", 5000);2.7. Atualizações e deleções em lote
A entidade de atualização em lote é concluída através da instrução ATUALIZAÇÃO. A exclusão de entidades em lote é feita por meio de declarações de exclusão. Ambos especificam as propriedades de uma entidade e sua classe.
entityManager.getTransaction (). BEGIN (); Query Query = entityManager.CreateQuery ("Atualizar Pessoa p Set P.FirstName =: Nome onde P.id =: id"); query.setParameter ("Nome", "xiaobai"); query.setParameter ("id", 2); entityManager.CreateQuery ("Exclua pessoa p onde p.id =: id"); query1.setParameter ("id", 9); query1.executeUpdate (); entityManager.gettransaction (). Commit ();3. Sugestões para o uso da consulta JPQL
Nos sistemas de aplicativos, o número de consultas geralmente é usado mais do que adicionar, modificar e excluir. Portanto, é particularmente importante usar a consulta e exibir razoavelmente.
1. Recomenda -se usar o nome nomeado (chamadoQuery)
Os programas fornecidos por persistência geralmente usam métodos pré-compilados para usar consultas nomeadas como parte da fase de inicialização do programa. Isso evita a sobrecarga do sistema de análise contínua do JPQL e geração de SQL.
2. Use a projeção para recuperar um pequeno número de colunas primeiro.
A consulta JPA geralmente retorna todas as colunas de toda a entidade, mas para uma enorme quantidade de dados, nem todas as colunas da entidade precisam ser usadas. Então podemos usar a projeção para lidar com isso.
List <LIST <Object [] >> PESSONS = EntityManager.CreateQuery ("Selecione nova lista (primeiro nome, idade) da Pessoa P"). GetResultList (); para (objeto O: pessoas) {System.out.println (O);} // Resultado de saída [Jack, 21] [Jack, 21] [Jack] [21] [Lily, 193];O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.