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:
Para o Eclipse, podemos seguir as etapas abaixo para ativar o processamento anotado:
Vá paraJava Compiler e certifique-se de que o nível de conformidade do compilador é 1.8 ou superior
Vá paraJava Compiler → Annotation Processinge habilite as configurações específicas do projeto e habilite o processamento de anotação
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.
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.