Introdução às consultas JDO 2/2

Introdução às consultas JDO 2/2

1. Visão geral

No artigo anterior desta série, mostramos como persistir objetos Java em diferentes armazenamentos de dados. Para obter mais detalhes, verifiqueGuide to Java Data Objects.

O JDO suporta diferentes linguagens de consulta para fornecer flexibilidade ao desenvolvedor para usar a linguagem de consulta com a qual ele está mais familiarizado.

2. Linguagens de consulta JDO

O JDO suporta os seguintes idiomas de consulta:

  • JDOQL - uma linguagem de consulta usando sintaxe Java

  • JDOQL digitado - seguindo a sintaxe JDOQL, mas fornecendo uma API para facilitar o uso das consultas.

  • SQL - usado apenas para RDBMS.

  • JPQL - fornecido pelo Datanucleus, mas não faz parte das especificações do JDO.

3. API de consulta

3.1. Criação de uma consulta

Para criar uma consulta, precisamos especificar o idioma, bem como uma consultaString:

Query query = pm.newQuery(
  "javax.jdo.query.SQL",
  "select * from product_item where price < 10");

Se não especificarmos a linguagem, o padrão será o JDOQL:

Query query = pm.newQuery(
  "SELECT FROM com.example.jdo.query.ProductItem WHERE price < 10");

3.2. Criação de uma consulta nomeada

Também podemos definir a consulta e fazer referência a ela pelo seu nome salvo.

Para fazer isso, primeiro criamos uma classeProductItem:

@PersistenceCapable
public class ProductItem {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.INCREMENT)
    int id;
    String name;
    String status;
    String description;
    double price;

    //standard getters, setters & constructors
}

Em seguida, adicionamos uma configuração de classe ao arquivoMETA-INF/package.jdo para definir uma consulta e nomeá-la:


    
        
            
            
            
        
    

Definimos uma consulta chamada “PriceBelow10″.

Podemos usá-lo em nosso código:

Query query = pm.newNamedQuery(
  ProductItem.class, "PriceBelow10");
List items = query.executeList();

3.3. Fechando aQuery

Para economizar recursos, podemos fechar as consultas:

query.close();

Da mesma forma, podemos fechar um conjunto de resultados específico, passando-o como um parâmetro para o métodoclose():

query.close(ResultSet);

3.4. Compilando umQuery

Se quisermos validar uma consulta, podemos chamar o métodocompile():

query.compile();

Se a consulta não for válida, o método lançará umJDOException.

4. JDOQL

JDOQL é uma linguagem de consulta baseada em objetos, projetada para fornecer o poder da linguagem SQL e preservar os relacionamentos de objetos Java no modelo de aplicativo.

As consultas JDOQL podem ser definidas em um formuláriosingle-String.

Antes de nos aprofundarmos, vamos examinar alguns conceitos básicos:

4.1. Classe de Candidato

A classe candidata no JDOQL deve ser uma classe persistente. Estamos usando o nome completo da classe em vez do nome da tabela na linguagem SQL:

Query query = pm.newQuery("SELECT FROM com.example.jdo.query.ProductItem");
List r = query.executeList();

Como podemos ver no exemplo acima,com.example.jdo.query.ProductItem é a classe candidata aqui.

4.2. Filtro

Um filtro pode ser escrito em Java, mas deve ser avaliado como um valor booleano:

Query query = pm.newQuery("SELECT FROM com.example.jdo.query.ProductItem");
query.setFilter("status == 'SoldOut'");
List result = query.executeList();

4.3. Métodos

O JDOQL não suporta todos os métodos Java, mas suporta vários métodos que podemos chamar a partir da consulta e podem ser usados ​​em uma ampla variedade:

query.setFilter("this.name.startsWith('supported')");

Para obter mais detalhes sobre os métodos suportados, verifique estelink.

4.4. Parâmetros

Podemos passar valores para consultas como parâmetros. Nós podemos definir os parâmetros explícita ou implicitamente.

Para definir um parâmetro explicitamente:

Query query = pm.newQuery(
  "SELECT FROM com.example.jdo.query.ProductItem "
  + "WHERE price < threshold PARAMETERS double threshold");
List result = (List) query.execute(10);

Isso também pode ser alcançado usando o métodosetParameters:

Query query = pm.newQuery(
  "SELECT FROM com.example.jdo.query.ProductItem "
  + "WHERE price < :threshold");
query.setParameters("double threshold");
List result = (List) query.execute(10);

Podemos fazer isso implicitamente, não definindo um tipo de parâmetro:

Query query = pm.newQuery(
  "SELECT FROM com.example.jdo.query.ProductItem "
  + "WHERE price < :threshold");
List result = (List) query.execute(10);

5. JDOQL Typed

Para usar o JDOQLTypedQueryAPI, precisamos preparar o ambiente.

5.1. Configuração do Maven


    org.datanucleus
    datanucleus-jdo-query
    5.0.2

...

    
        maven-compiler-plugin
        
            1.8
            1.8
        
    

As versões mais recentes dessas dependências sãodatanucleus-jdo-queryemaven-compiler-plugin.

5.2. Habilitando o processamento de anotações

Para o Eclipse, podemos seguir as etapas abaixo para ativar o processamento anotado:

  1. Vá paraJava Compiler e certifique-se de que o nível de conformidade do compilador é 1.8 ou superior

  2. Vá paraJava Compiler → Annotation Processinge habilite as configurações específicas do projeto e habilite o processamento de anotação

  3. Vá paraJava Compiler → Annotation Processing → Factory Path, habilite as configurações específicas do projeto e, em seguida, adicione os seguintes jars à lista:javax.jdo.jar,datanucleus-jdo-query.jar

A preparação acima significa que sempre que compilamos classes persistentes, o processador de anotação no datanucleus-jdo-query.jar irá gerar uma classe de consulta para cada classe anotada por@PersistenceCapable.

Em nosso caso, o processador gera uma classeQProductItem. A classe gerada tem quase o mesmo nome da classe persistente, embora prefixada com um Q.

5.3. Criar consulta tipificada JDOQL:

JDOQLTypedQuery tq = pm.newJDOQLTypedQuery(ProductItem.class);
QProductItem cand = QProductItem.candidate();
tq = tq.filter(cand.price.lt(10).and(cand.name.startsWith("pro")));
List results = tq.executeList();

Podemos fazer uso da classe de consulta para acessar os campos candidatos e usar seus métodos Java disponíveis.

6. SQL

O JDO suporta a linguagem SQL no caso de estarmos usando um RDBMS.

Vamos criar uma consulta SQL:

Query query = pm.newQuery("javax.jdo.query.SQL","select * from "
  + "product_item where price < ? and status = ?");
query.setClass(ProductItem.class);
query.setParameters(10,"InStock");
List results = query.executeList();

UsamossetClass() para a consulta para recuperar objetosProductItem quando executamos a consulta. Caso contrário, ele recupera um tipoObject.

7. JPQL

O JDO DataNucleus fornece a linguagem JPQL.

Vamos criar uma consulta usando JPQL:

Query query = pm.newQuery("JPQL","select i from "
  + "com.example.jdo.query.ProductItem i where i.price < 10"
  + " and i.status = 'InStock'");
List results = (List) query.execute();

O nome da entidade aqui écom.example.jdo.query.ProductItem. Não podemos usar apenas o nome da classe. Isso ocorre porque JDO não tem metadados para definir um nome de entidade como JPA. Definimos umProductItemp, e depois disso, podemos usarp como um alias para se referir aoProductItem.

Para obter mais detalhes sobre a sintaxe JPQL, verifique estelink.

8. Conclusão

Neste artigo, mostramos as diferentes linguagens de consulta suportadas pelo JDO. Mostramos como salvar consultas nomeadas para reutilização e explicamos os conceitos do JDOQL e mostramos como usar SQL e JPQL com o JDO.

Os exemplos de código no artigo podem ser encontradosover on GitHub.