Escolar Documentos
Profissional Documentos
Cultura Documentos
4.4.0
Índice
Prefácio
1. Introdução
1.1. Fundo
1.2. Princípios
2. Tutoriais
2.1. Consultando PSD
2.1.1. Integração Maven
2.1.2. Integração de formigas
2.1.3. Usando Querydsl JPA no Roo
2.1.4. Gerando o modelo a partir de arquivos hbm.xml
2.1.5. Usando tipos de consulta
2.1.6. Consultando
2.1.7. Usando junções
2.1.8. Uso geral
2.1.9. Encomenda
2.1.10. Grouping
2.1.11. Delete clauses
2.1.12. Update clauses
2.1.13. Subqueries
2.1.14. Exposing the original query
2.1.15. Using Native SQL in JPA queries
2.4.5. Herança
3. Uso geral
3.1. Criação de consultas
3.1.1. Predicados complexos
3.1.2. Expressões dinâmicas
3.1.3. Caminhos dinâmicos
3.1.4. Expressões de caso
3.1.5. Expressões de elenco
3.1.6. Selecione literais
4. Solução de problemas
4.1. Argumentos de tipo insuficientes
Prefácio
Querydsl é uma estrutura que permite a construção de consultas semelhantes a SQL tipadas estaticamente. Em
vez de escrever consultas como strings embutidas ou externalizá-las em arquivos XML, elas podem ser
construídas por meio de uma API fluente como o Querydsl.
Os benefícios de usar uma API fluente em comparação com strings simples são, por exemplo
1. Introdução
1.1. Fundo
Querydsl nasceu da necessidade de manter consultas HQL de uma maneira segura de tipos. A construção
incremental de consultas HQL requer concatenação de String e resulta em código difícil de ler. Referências
inseguras a tipos de domínio e propriedades por meio de Strings simples eram outro problema com a construção
HQL baseada em String.
Com um modelo de domínio em mudança, a segurança de tipo traz enormes benefícios no desenvolvimento de
software. As alterações de domínio são refletidas diretamente nas consultas e o preenchimento automático na
construção da consulta torna a construção da consulta mais rápida e segura.
HQL para Hibernate foi a primeira linguagem alvo para Querydsl, mas hoje em dia suporta JPA, JDO, JDBC,
Lucene, Hibernate Search, MongoDB, Collections e RDFBean como backends.
1.2. Princípios
A segurança de tipo é o princípio central do Querydsl. As consultas são construídas com base nos tipos de
consulta gerados que refletem as propriedades dos seus tipos de domínio. Além disso, as invocações de função /
método são construídas de maneira totalmente segura.
A consistência é outro princípio importante. Os caminhos e operações de consulta são os mesmos em todas as
implementações e também as interfaces de consulta têm uma interface de base comum.
Para ter uma impressão da expressividade dos tipos de consulta e expressão Querydsl, vá para os javadocs e
explore com.querydsl.core.Query, com.querydsl.core.Fetchable e com.querydsl.core.types.Expression.
2. Tutoriais
Em vez de um guia de primeiros passos geral, fornecemos guias de integração para os principais back-ends do
Querydsl.
Querydsl para JPA é uma alternativa para consultas JPQL e Criteria. Ele combina a natureza dinâmica das
consultas de Critérios com a expressividade do JPQL e tudo isso de uma maneira totalmente segura.
<dependency>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-apt </artifactId>
<version> $ {querydsl.version} </version>
<scope> fornecido </scope>
</dependency>
<dependency>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-jpa </artifactId>
<version> $ {querydsl.version} </version>
</dependency>
<dependency>
<groupId> org.slf4j </groupId>
<artifactId> slf4j-log4j12 </artifactId>
<version> 1.6.1 </version>
</dependency>
<projeto>
<build>
<plugins>
...
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
The JPAAnnotationProcessor finds domain types annotated with the javax.persistence.Entity annotation and
generates query types for them.
If you use Hibernate annotations in your domain types you should use the APT processor
com.querydsl.apt.hibernate.HibernateAnnotationProcessor instead.
Run clean install and you will get your Query types generated into target/generated-sources/java.
If you use Eclipse, run mvn eclipse:eclipse to update your Eclipse project to include target/generated-sources/java
as a source folder.
Now you are able to construct JPA query instances and instances of the query domain model.
2.1.2. Ant integration
Place the jar files from the full-deps bundle on your classpath and use the following tasks for Querydsl code
generation:
Replace src with your main source folder, generated with your folder for generated sources and build with your
target folder.
The HibernateDomainExporter needs to be executed within a classpath where the domain types are visible, since
the property types are resolved via reflection.
All JPA annotations are ignored, but Querydsl annotations such as @QueryInit and @QueryType are taken into
account.
Let's assume that your project has the following domain type:
@Entity
public class Customer {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(String fn) {
firstName = fn;
}
public void setLastName(String ln) {
lastName = ln;
}
}
Querydsl will generate a query type with the simple name QCustomer into the same package as Customer.
QCustomer can be used as a statically typed variable in Querydsl queries as a representative for the Customer
type.
QCustomer has a default instance variable which can be accessed as a static field:
Alternatively you can define your own Customer variables like this:
2.1.6. Querying
The Querydsl JPA module supports both the JPA and the Hibernate API.
To use the JPA API you use JPAQuery instances for your queries like this:
If you are using the Hibernate API instead, you can instantiate a HibernateQuery like this:
For the examples of this chapter the queries are created via a JPAQueryFactory instance. JPAQueryFactory
should be the preferred option to obtain JPAQuery instances.
To retrieve the customer with the first name Bob you would construct a query like this:
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 6/43
20/05/2021 Guia de referência do Querydsl
QCustomer customer = QCustomer.customer;
Customer bob = queryFactory.selectFrom(customer)
.where(customer.firstName.eq("Bob"))
.fetchOne();
The selectFrom call defines the query source and projection, the where part defines the filter and fetchOne tells
Querydsl to return a single element. Easy, right?
To create a query with multiple sources you use the query like this:
queryFactory.selectFrom(customer)
.where(customer.firstName.eq("Bob"), customer.lastName.eq("Wilson"));
Or like this
queryFactory.selectFrom(customer)
.where(customer.firstName.eq("Bob").and(customer.lastName.eq("Wilson")));
If you want to combine the filters via "or" then use the following pattern
queryFactory.selectFrom(customer)
.where(customer.firstName.eq("Bob").or(customer.lastName.eq("Wilson")));
2.1.7. Using joins
Querydsl supports the following join variants in JPQL: inner join, join, left join and right join. Join usage is typesafe,
and follows the following pattern:
Another example
queryFactory.selectFrom(cat)
.leftJoin(cat.kittens, kitten)
.on(kitten.bodyWeight.gt(10.0))
.fetch();
2.1.8. General usage
Use the the cascading methods of the JPQLQuery interface like this
select: Set the projection of the query. (Not necessary if created via query factory)
innerJoin, join, leftJoin, rightJoin, on: Add join elements using these constructs. For the join methods the first
argument is the join source and the second the target (alias).
where: Add query filters, either in varargs form separated via commas or cascaded via the and-operator.
having: Add having filters of the "group by" grouping as an varags array of Predicate expressions.
orderBy: Add ordering of the result as an varargs array of order expressions. Use asc() and desc() on numeric,
string and other comparable expression to access the OrderSpecifier instances.
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 7/43
20/05/2021 Guia de referência do Querydsl
limit, offset, restrict: Set the paging of the result. Limit for max results, offset for skipping rows and restrict for
defining both in one call.
2.1.9. Ordering
The syntax for declaring ordering is
2.1.10. Grouping
Grouping can be done in the following form
selecione customer.lastName
do cliente como cliente
agrupar por cliente.lastName
A chamada where é opcional e a chamada execute executa a exclusão e retorna a quantidade de entidades
excluídas.
As cláusulas DML em JPA não levam em conta as regras em cascata do nível JPA e não fornecem interação de
cache de segundo nível refinada.
As invocações set definem as atualizações de propriedade no estilo SQL-Update e a chamada execute executa
Update e retorna a quantidade de entidades atualizadas.
As cláusulas DML em JPA não levam em conta as regras em cascata do nível JPA e não fornecem interação de
cache de segundo nível refinada.
2.1.13. Subconsultas
Para criar uma subconsulta, você usa os métodos de fábrica estáticos JPAExpressionse define os parâmetros de
consulta por meio de, onde etc.
Outro exemplo
To use it, you must generate Querydsl query types for your SQL schema. This can be done for example with the
following Maven configuration:
<project>
<build>
<plugins>
...
<plugin>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>${querydsl.version}</version>
<executions>
<execution>
<goals>
<goal>export</goal>
</goals>
</execution>
</executions>
<configuration>
<jdbcDriver>org.apache.derby.jdbc.EmbeddedDriver</jdbcDriver>
<jdbcUrl>jdbc:derby:target/demoDB;create=true</jdbcUrl>
<packageName>com.mycompany.mydomain</packageName>
<targetFolder>${project.basedir}/target/generated-sources/java</targetFolder>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>${derby.version}</version>
</dependency>
</dependencies>
</plugin>
...
</plugins>
</build>
</project>
When the query types have successfully been generated into the location of your choice, you can use them in your
queries.
// serialization templates
SQLTemplates templates = new DerbyTemplates();
// query types (S* for SQL, Q* for domain types)
SAnimal cat = new SAnimal("cat");
SAnimal mate = new SAnimal("mate");
QCat catEntity = QCat.cat;
JPASQLQuery<?> query = new JPASQLQuery<Void>(entityManager, templates);
List<String> names = query.select(cat.name).from(cat).fetch();
If you mix entity (e.g. QCat) and table (e.g. SAnimal) references in your query you need to make sure that they use
the same variable names. SAnimal.animal has the variable name "animal", so a new instance (new
SAnimal("cat")) was used instead.
If you are using the Hibernate API instead of the JPA API, then use HibernateSQLQuery instead.
2.2. Querying JDO
Querydsl defines a general statically typed syntax for querying on top of persisted domain model data. JDO and
JPA are the primary integration technologies for Querydsl. This guide describes how to use Querydsl in
combination with JDO.
2.2.1. Maven integration
Add the following dependencies to your Maven project:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jdo</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
And now, configure the Maven APT plugin which generates the query types used by Querydsl:
<project>
<build>
<plugins>
...
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jdo.JDOAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
Execute a instalação limpa e você obterá seus tipos de consulta gerados em target / generated-sources / java.
Se você usar Eclipse, execute mvn eclipse: eclipse para atualizar seu projeto Eclipse para incluir target /
generated-sources / java como uma pasta de origem.
Agora você pode construir instâncias de consulta JDO e instâncias do modelo de domínio de consulta.
Substitua src por sua pasta de origem principal, gerada com sua pasta para origens geradas e construa com sua
pasta de destino.
@PersistenceCapable
public class Cliente {
private String firstName;
private String lastName;
public String getFirstName () {
return firstName;
}
public String getLastName () {
return lastName;
}
public void setFirstName (String fn) {
firstName = fn;
}
public void setLastName (String ln) {
lastName = ln;
}
}
Querydsl irá gerar um tipo de consulta com o nome simples QCustomer no mesmo pacote que Customer.
QCustomer pode ser usado como uma variável digitada estaticamente em Querydsl como um representante para
o tipo de Cliente.
QCustomer tem uma variável de instância padrão que pode ser acessada como um campo estático:
Alternativamente, você pode definir suas próprias variáveis de cliente como este:
QCustomer reflete todas as propriedades do tipo original Cliente como campos públicos. O campo firstName pode
ser acessado assim
customer.firstName;
PersistenceManager pm = ...;
JDOQuery<?> query = new JDOQuery<Void>(pm);
For the examples of this chapter the queries are created via a JDOQueryFactory instance. JDOQueryFactory
should be the preferred option to obtain JDOQuery instances.
To retrieve the customer with the first name Bob you would construct a query like this:
The selectFrom call defines the query source and projection, the where part defines the filter and fetchOne tells
Querydsl to return a single element. Easy, right?
To create a query with multiple sources you just use the JDOQuery class like this:
queryFactory.selectFrom(customer)
.where(customer.firstName.eq("Bob"), customer.lastName.eq("Wilson"));
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 11/43
20/05/2021 Guia de referência do Querydsl
Or like this
queryFactory.selectFrom(customer)
.where(customer.firstName.eq("Bob").and(customer.lastName.eq("Wilson")));
If you want to combine the filters via "or" then use the following pattern
queryFactory.selectFrom(customer)
.where(customer.firstName.eq("Bob").or(customer.lastName.eq("Wilson")));
2.2.5. General usage
Use the the cascading methods of the JDOQuery class like this
select: Set the projection of the query. (Not necessary if created via query factory)
from: Add query sources here, the first argument becomes the main source and the others are treated as
variables.
where: Add query filters, either in varargs form separated via commas or cascaded via the and-operator.
having: Add having filters of the "group by" grouping as an varargs array of Predicate expressions.
orderBy: Add ordering of the result as an varargs array of order expressions. Use asc() and desc() on numeric,
string and other comparable expression to access the OrderSpecifier instances.
limit, offset, restrict: Set the paging of the result. Limit for max results, offset for skipping rows and restrict for
defining both in one call.
2.2.6. Ordering
The syntax for declaring ordering is
2.2.7. Grouping
Grouping can be done in the following form
queryFactory.select(customer.lastName).from(customer)
.groupBy(customer.lastName)
.fetch();
2.2.8. Delete clauses
Delete clauses in Querydsl JDO follow a simple delete-where-execute form. Here are some examples:
The second parameter of the JDODeleteClause constructor is the entity to be deleted. The where call is optional
and the execute call performs the deletion and returns the amount of deleted entities.
2.2.9. Subqueries
To create a subquery you can use one of the factory methods of JDOExpressions and add the query parameters
via from, where etc.
Another example
Para usá-lo, você deve gerar tipos de consulta Querydsl para seu esquema SQL. Isso pode ser feito, por
exemplo, com a seguinte configuração do Maven:
<projeto>
<build>
<plugins>
...
<plugin>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-maven-plugin </artifactId>
<version> $ {querydsl.version} </version>
<executions>
<execution>
<goals>
<goal> export </goal>
</goals>
</execution>
</executions>
<configuration>
<jdbcDriver> org.apache.derby.jdbc.EmbeddedDriver </jdbcDriver>
<jdbcUrl> jdbc: derby: target / demoDB; create = true </jdbcUrl>
<packageName> com.mycompany.mydomain </packageName>
<targetFolder> $ {project.basedir} / target / generated-sources / java</targetFolder>
</configuration>
<dependencies>
<dependency>
<groupId> org.apache.derby </groupId>
<artifactId> derby </artifactId>
<version> $ {derby.version} </version>
</ dependency >
</dependencies>
</plugin>
...
</plugins>
</build>
</project>
Quando os tipos de consulta forem gerados com sucesso no local de sua escolha, você poderá usá-los em suas
consultas.
Listar <Tuple> linhas = query.select (cat.all ()). From (cat) .fetch ();
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 13/43
20/05/2021 Guia de referência do Querydsl
2.3. Querying SQL
This chapter describes the query type generation and querying functionality of the SQL module.
2.3.1. Maven integration
Add the following dependencies to your Maven project:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-sql</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-sql-codegen</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
The querydsl-sql-codegen dependency can be skipped, if code generation happens via Maven.
<project>
<build>
<plugins>
...
<plugin>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>${querydsl.version}</version>
<executions>
<execution>
<goals>
<goal>export</goal>
</goals>
</execution>
</executions>
<configuration>
<jdbcDriver>org.apache.derby.jdbc.EmbeddedDriver</jdbcDriver>
<jdbcUrl>jdbc:derby:target/demoDB;create=true</jdbcUrl>
<packageName>com.myproject.domain</packageName>
<targetFolder>${project.basedir}/target/generated-sources/java</targetFolder>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>${derby.version}</version>
</dependency>
</dependencies>
</plugin>
...
</plugins>
</build>
</project>
Use the goal test-export to treat the target folder as a test source folder for use with test code.
Table 2.1. Parameters
Name Description
beanInterfaces array of interface classnames to add to the bean classes (default: empty)
Name Description
a schema name pattern in LIKE pattern form; must match the schema name
schemaPattern as it is stored in the database, multiple can be separated by comma (default:
null)
a table name pattern in LIKE pattern form; must match the table name as it is
tableNamePattern
stored in the database, multiple can be separated by comma (default: null)
target folder where bean sources should be generated, defaults to the same
beansTargetFolder
value as targetFolder
exportBeans set to true to generate beans as well, see section 2.14.13 (default: false)
innerClassesForKeys set to true to generate inner classes for keys (default: false)
createScalaSources whether to export Scala sources instead of Java sources, (default: false)
<customTypes>
<customType>com.querydsl.sql.types.InputStreamType</customType>
</customTypes>
<typeMappings>
<typeMapping>
<table>IMAGE</table>
<column>CONTENTS</column>
<type>java.io.InputStream</type>
</typeMapping>
</typeMappings>
Table 2.2. Numeric mappings
> 18 0 BigInteger
>9 0 Long
>4 0 Integer
>2 0 Short
>0 0 Byte
They can be customized for specific total/decimal digits combinations like this:
<numericMappings>
<numericMapping>
<total>1</total>
<decimal>0</decimal>
<javaType>java.lang.Byte</javaType>
</numericMapping>
</numericMappings>
Schemas, tables and columns can also be renamed using the plugin. Here are some examples:
Renaming a schema:
<renameMappings>
<renameMapping>
<fromSchema>PROD</fromSchema>
<toSchema>TEST</toSchema>
</renameMapping>
</renameMappings>
Renaming a table:
<renameMappings>
<renameMapping>
<fromSchema>PROD</fromSchema>
<fromTable>CUSTOMER</fromTable>
<toTable>CSTMR</toTable>
</renameMapping>
</renameMappings>
Renaming a column:
<renameMappings>
<renameMapping>
<fromSchema>PROD</fromSchema>
<fromTable>CUSTOMER</fromTable>
<fromColumn>ID</fromColumn>
<toColumn>IDX</toTable>
</renameMapping>
</renameMappings>
Compared to APT based code generation certain functionality is not available such as QueryDelegate annotation
handling.
The composite types are used without the wrapper element like in this example.
To get started export your schema into Querydsl query types like this:
This declares that the database schema is to be mirrored into the com.myproject.domain package in the
target/generated-sources/java folder.
The generated types have the table name transformed to mixed case as the class name and a similar mixed case
transformation applied to the columns which are available as property paths in the query type.
Além dessa chave primária e restrições de chave estrangeira são fornecidas como campos que podem ser
usados para declarações de junção compacta.
2.3.5. Configuração
A configuração é feita por meio da classe com.querydsl.sql.Configuration, que usa o dialeto Querydsl SQL como
argumento. Para H2, você o criaria assim
Querydsl usa dialetos SQL para personalizar a serialização SQL necessária para diferentes bancos de dados
relacionais. Os dialetos disponíveis são:
Para instâncias SQLTemplates personalizadas, você pode usar o padrão do construtor como este
H2Templates.builder ()
.printSchema () // para incluir o esquema na saída
.quote () // para citar nomes
.newLineToSingleSpace () // para substituir novas linhas por um único espaço na saída
.escape (ch) // para definir o caractere de escape
.construir(); // para obter a instância SQLTemplates personalizada
Os métodos da classe Configuration podem ser usados para permitir a serialização direta de literais por meio de
setUseLiterals (true), substituir o esquema e as tabelas e registrar os tipos personalizados. Para obter detalhes
completos, consulte os javadocs de Configuração.
2.3.6. Consultando
Para os exemplos a seguir, usaremos a SQLQueryFactoryclasse para a criação de consultas. Usá-lo resulta em
um código mais conciso em comparação com a criação de consulta baseada no construtor.
que é transformada na seguinte consulta sql, supondo que o nome da tabela relacionada seja cliente e as colunas
first name e last name :
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 17/43
20/05/2021 Guia de referência do Querydsl
first_name e last_name :
SELECT c.last_name
DO cliente c
ONDE c.first_name = 'Bob'
select: Set the projection of the query. (Not necessary if created via query factory)
innerJoin, join, leftJoin, rightJoin, fullJoin, on: Add join elements using these constructs. For the join methods the
first argument is the join source and the second the target (alias).
where: Add query filters, either in varargs form separated via commas or cascaded via the and-operator.
having: Add having filter of the "group by" grouping as an varags array of Predicate expressions.
orderBy: Add ordering of the result as an varargs array of order expressions. Use asc() and desc() on numeric,
string and other comparable expression to access the OrderSpecifier instances.
limit, offset, restrict: Set the paging of the result. Limit for max results, offset for skipping rows and restrict for
defining both in one call.
2.3.8. Joins
Joins are constructed using the following syntax:
2.3.9. Ordering
The syntax for declaring ordering is
queryFactory.select(customer.firstName, customer.lastName)
.from(customer)
.orderBy(customer.lastName.asc(), customer.firstName.asc())
.fetch();
2.3.10. Grouping
Grouping can be done in the following form
queryFactory.select(customer.lastName)
.from(customer)
.groupBy(customer.lastName)
.fetch();
SELECT c.last_name
FROM customer c
GROUP BY c.last_name
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 18/43
20/05/2021 Guia de referência do Querydsl
2.3.11. Using Subqueries
To create a subquery you can use one of the factory methods of SQLExpressions and add the query parameters
via from, where etc.
Another example
2.3.12. Selecting literals
To select literals you need to create constant instances for them like this:
queryFactory.select(Expressions.constant(1),
Expressions.constant("abc"));
The class com.querydsl.core.types.dsl.Expressions offers also other useful static methods for projections,
operation and template creation.
// ...
}
The flags are custom SQL snippets that can be inserted at specific points in the serialization. The supported
positions are the enums of the com.querydsl.core.QueryFlag.Position enum class.
2.3.14. Window functions
Window functions are supported in Querydsl via the methods in the SQLExpressions class.
Usage example:
queryFactory.select(SQLExpressions.rowNumber()
.over()
.partitionBy(employee.name)
.orderBy(employee.id))
.from(employee)
E d li t d l
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 19/43
20/05/2021 Guia de referência do Querydsl
E usando uma lista de colunas
Se as colunas da expressão de tabela comum são um subconjunto de uma tabela ou visão existente, é
aconselhável usar um tipo de caminho gerado para ela, por exemplo, QEmployee neste caso, mas se as colunas
não cabem em nenhuma tabela existente, o PathBuilder pode ser usado em vez de.
2.3.17.1. Inserir
Com colunas
Sem colunas
queryFactory.insert (survey)
.values ( 4 , "Olá" ) .execute ();
Com subconsulta
queryFactory.insert (survey)
.columns (survey.id, survey.name)
.select (SQLExpressions.select (survey2.id.add ( 1 ), survey2.name) .from (survey2))
.executar();
queryFactory.insert (survey)
.select (SQLExpressions.select (survey2.id.add ( 10 ), survey2.name) .from (survey2))
.executar();
Como alternativa ao uso de colunas / valores, Querydsl fornece também um método de conjunto que pode ser
usado desta forma
que é equivalente ao primeiro exemplo. O uso do método set sempre se expande internamente para colunas e
valores.
Para obter as chaves criadas em vez da contagem de linhas modificadas, use um dos métodos executeWithKey /
s.
definir(...)
mapas colunas únicas e nulos são usados para resultados de subconsulta vazios.
Para preencher uma instância de cláusula com base no conteúdo de um bean, você pode usar
queryFactory.insert (survey)
l t ( B ) t ()
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 20/43
20/05/2021 Guia de referência do Querydsl
.populate (surveyBean) .execute ();
Isso excluirá ligações nulas, se você também precisar de ligações nulas, use
queryFactory.insert (survey)
.populate (surveyBean, DefaultMapper.WITH_NULL_BINDINGS) .execute ();
2.3.17.2. Atualizar
Com onde
Without where
queryFactory.update(survey)
.set(survey.name, "S")
.execute();
queryFactory.update(survey)
.populate(surveyBean)
.execute();
2.3.17.3. Delete
With where
Without where
queryFactory.delete(survey)
.execute()
Update:
Delete:
queryFactory.insert(survey).values(2, "A").execute();
queryFactory.insert(survey).values(3, "B").execute();
SQLDeleteClause delete = queryFactory.delete(survey);
delete.where(survey.name.eq("A")).addBatch();
delete.where(survey.name.eq("B")).addBatch();
assertEquals(2, delete.execute());
Insert:
Now you can use the bean types as arguments to the populate method in DML clauses and you can project
directly to bean types in queries. Here is a simple example in JUnit form:
If you need also all literals in the SQL string you can enable literal serialization on the query or configuration level
via setUseLiterals(true).
2.3.21. Custom types
Querydsl SQL provides the possibility to declare custom type mappings for ResultSet/Statement interaction. The
custom type mappings can be declared in com.querydsl.sql.Configuration instances, which are supplied as
constructor arguments to the actual queries:
To customize a numeric mapping you can use the registerNumeric method like this
configuration.registerNumeric(5,2,Float.class);
Use cases for listeners are data synchronization, logging, caching and validation.
2.3.23. Spring integration
Querydsl SQL integrates with Spring through the querydsl-sql-spring module:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-sql-spring</artifactId>
<version>${querydsl.version}</version>
</dependency>
It provides Spring exception translation and a Spring connection provider for usage of Querydsl SQL with Spring
transaction managers. Below is a configuration example:
package com.querydsl.example.config;
import com.querydsl.sql.H2Templates;
import com.querydsl.sql.SQLQueryFactory;
import com.querydsl.sql.SQLTemplates;
import com.querydsl.sql.spring.SpringConnectionProvider;
import com.querydsl.sql.spring.SpringExceptionTranslator;
import com.querydsl.sql.types.DateTimeType;
import com.querydsl.sql.types.LocalDateType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
i i f k i
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 22/43
20/05/2021 Guia de referência do Querydsl
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.sql.DataSource;
import java.sql.Connection;
@Configuration
public class JdbcConfiguration {
@Bean
public DataSource dataSource() {
// implementation omitted
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
public com.querydsl.sql.Configuration querydslConfiguration() {
SQLTemplates templates = H2Templates.builder().build(); //change to your Templates
com.querydsl.sql.Configuration configuration = new com.querydsl.sql.Configuration(templates);
configuration.setExceptionTranslator(new SpringExceptionTranslator());
return configuration;
}
@Bean
public SQLQueryFactory queryFactory() {
Provider<Connection> provider = new SpringConnectionProvider(dataSource());
return new SQLQueryFactory(querydslConfiguration(), provider);
}
}
2.4. Querydsl Spatial
Support for Spatial queries is available via the Querydsl Spatial module, which is an extension module to the SQL
module. The Spatial module supports the object model of Simple Feature Access in queries and object binding.
Geometry
2.4.1. Maven integration
Add the following dependency to your Maven project:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-sql-spatial</artifactId>
<version>${querydsl.version}</version>
</dependency>
<project>
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 23/43
20/05/2021 Guia de referência do Querydsl
project
<build>
<plugins>
...
<plugin>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>${querydsl.version}</version>
...
<configuration>
...
<spatial>true</spatial>
</configuration>
</plugin>
...
</plugins>
</build>
</project>
2.4.3. Runtime configuration
O aspecto de configuração de tempo de execução do módulo espacial é que, em vez das instâncias normais de
SQLTemplates, são utilizadas instâncias ativadas espacialmente. Abaixo está uma lista de classes SQLTemplates
habilitadas espaciais.
MySQLSpatialTemplates
PostGISTemplates
SQLServer2008SpatialTemplates
TeradataSpatialTemplates
2.4.4. Consultando
Com a geração de código e configuração de tempo de execução definidas para tipos espaciais, agora podemos
tentar consultas com ele.
Além da distância reta entre as geometrias, as distâncias esféricas e esferoidais são fornecidas por
distanceSphere e distanceSpheroid.
2.4.4.2. Contém
2.4.4.3. Interseção
2.4.5. Herança
No caso de você usar apenas tipos de geometria genéricos em seu esquema de banco de dados, você pode usar
métodos de conversão no modelo de objeto para converter para tipos mais específicos.
2 5 1 Integração Maven
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 24/43
20/05/2021 Guia de referência do Querydsl
2.5.1. Integração Maven
Querydsl Lucene pode ser usado por meio do módulo querydsl-lucene3 para Lucene 3, querydsl-lucene4 para
Lucene 4 e querydsl-lucene5 para Lucene 5
Lucene 3:
<dependency>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-lucene3 </artifactId>
<version> $ {querydsl.version} </version>
</dependency>
<dependency>
<groupId> org.slf4j </groupId>
<artifactId> slf4j-log4j12 </artifactId>
<version> 1.6.1 </version>
</dependency>
Lucene 4:
<dependency>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-lucene4 </artifactId>
<version> $ {querydsl.version} </version>
</dependency>
<dependency>
<groupId> org.slf4j </groupId>
<artifactId> slf4j-log4j12 </artifactId>
<version> 1.6.1 </version>
</dependency>
Lucene 5:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-lucene5</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
A geração de código não está disponível para Lucene, uma vez que nenhum dado de esquema está disponível.
2.5.3. Consultando
Consultar com Querydsl Lucene é tão simples quanto isto:
onde: Adicione os filtros de consulta, na forma de varargs separados por vírgulas ou em cascata por meio do
operador and. As operações com suporte são operações realizadas em PStrings, exceto match , indexOf , charAt
. Atualmente em não é suportado, mas será no futuro.
orderBy: Adicione a ordem do resultado como uma matriz varargs de expressões de ordem. Use asc () e desc ()
em numérico, string e outra expressão comparável para acessar as instâncias OrderSpecifier.
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 25/43
20/05/2021 Guia de referência do Querydsl
em numérico, string e outra expressão comparável para acessar as instâncias OrderSpecifier.
limite, deslocamento, restrição: Defina a paginação do resultado. Limite para resultados máximos, deslocamento
para pular linhas e restrinja para definir ambos em uma chamada.
2.5.5. Encomenda
A sintaxe para declarar a ordem é
inquerir
.onde (doc.title.like ( "*" ))
.orderBy (doc.title.asc (), doc.year.desc ())
.buscar();
título:*
Alternativamente, uma chamada de método de classificação pode ser usada para declarar a lógica de
classificação como uma instância de classificação.
2.5.6. Limite
A sintaxe para declarar um limite é
inquerir
.onde (doc.title.like ( "*" ))
.limit ( 10 )
.buscar();
2.5.7. Desvio
A sintaxe para declarar um deslocamento é
inquerir
.onde (doc.title.like ( "*" ))
.offset ( 3 )
.buscar();
query
.where(LuceneExpressions.fuzzyLike(doc.title, "Hello"))
.fetch();
query
.where(doc.title.like("*"))
.filter(filter)
.fetch();
query
.where(doc.title.like("*"))
.distinct(doc.title)
.fetch();
2.6.2. Querying
Querying with Querydsl Hibernate Search is as simple as this:
2.6.3. General usage
For general usage instructions see Querying Lucene sources .
In the query serialization the only difference to the Querydsl Lucene module is that paths are treated differently.
For org.hibernate.search.annotations.Field annotated properties the name attribute is used with the property
name as fallback for the field name.
2.7. Querying Mongodb
This chapter describes the querying functionality of the Mongodb module.
2.7.1. Maven integration
Add the following dependencies to your Maven project:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-mongodb</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
And now, configure the Maven APT plugin which generates the query types used by Querydsl:
<project>
<build>
<plugins>
...
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.morphia.MorphiaAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
Run clean install and you will get your Query types generated into target/generated-sources/java.
If you use Eclipse, run mvn eclipse:eclipse to update your Eclipse project to include target/generated-sources/java
as a source folder.
Now you are able to construct Mongodb queries and instances of the query domain model.
2.7.2. Querying
Querying with Querydsl Mongodb with Morphia is as simple as this:
Morphia morphia;
Datastore datastore;
// ...
QUser user = new QUser("user");
MorphiaQuery<User> query = new MorphiaQuery<User>(morphia, datastore, user);
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 27/43
20/05/2021 Guia de referência do Querydsl
p Q y q y p Q y ( p , , );
List<User> list = query
.where(user.firstName.eq("Bob"))
.fetch();
2.7.3. General usage
Use the the cascading methods of the MongodbQuery class like this
where: Add the query filters, either in varargs form separated via commas or cascaded via the and-operator.
Supported operations are operations performed on PStrings except matches , indexOf , charAt . Currently in is not
supported, but will be in the future.
orderBy: Add ordering of the result as an varargs array of order expressions. Use asc() and desc() on numeric,
string and other comparable expression to access the OrderSpecifier instances.
limit, offset, restrict: Set the paging of the result. Limit for max results, offset for skipping rows and restrict for
defining both in one call.
2.7.4. Ordering
The syntax for declaring ordering is
query
.where(doc.title.like("*"))
.orderBy(doc.title.asc(), doc.year.desc())
.fetch();
2.7.5. Limit
The syntax for declaring a limit is
query
.where(doc.title.like("*"))
.limit(10)
.fetch();
2.7.6. Offset
The syntax for declaring an offset is
query
.where(doc.title.like("*"))
.offset(3)
.fetch();
2.7.7. Geospatial queries
Support for geospatial queries is available for Double typed arrays (Double[]) via the near-method:
query
.where(geoEntity.location.near(50.0, 50.0))
.fetch();
query
.where(doc.title.like("*"))
.fetch(doc.title, doc.path);
This query will load only the title and path fields of the documents.
2.8. Querying Collections
The querydsl-collections module can be used with generated query types and without. The first section describes
the usage without generated query types:
And now create an alias instance for the Cat class. Alias instances can only be created for non-final classes with
an empty constructor. Make sure your class has one.
The alias instance of type Cat and its getter invocations are transformed into paths by wrapping them into dollar
method invocations. The call c.getKittens() for example is internally transformed into the property path
c.kittens inside the dollar method.
The following example is a variation of the previous, where the access to the list size happens inside the dollar-
method invocation.
Todas as propriedades digitadas não primitivas e não finais de apelidos são eles próprios apelidos. Portanto, você
pode fazer chamadas de método em cascata até atingir um tipo primitivo ou não final (por exemplo,
java.lang.String) no escopo do método dólar.
por exemplo
não é transformado corretamente, uma vez que a chamada toLowerCase () não é rastreada.
Observe também que você só pode invocar getters, size (), contains (Object) e get (int) em tipos de alias. Todas
as outras invocações lançam exceções.
Ao usar tipos de consulta gerados, você instancia expressões em vez de instâncias de alias e usa os caminhos de
propriedade diretamente, sem qualquer agrupamento de método de dólar.
<dependency>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-apt </artifactId>
<version> $ {querydsl.version} </version>
<scope> fornecido </scope>
</dependency>
<dependency>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-Collections </artifactId>
<version> $ {querydsl.version} </version>
</dependency>
<dependency>
<groupId> org.slf4j </groupId>
<artifactId> slf4j-log4j12 </artifactId>
<version> 1.6.1 </version>
</dependency>
Se não estiver usando JPA ou JDO, você pode gerar tipos de expressão para seus tipos de domínio, anotando-os
com a com.querydsl.core.annotations.QueryEntity anotação e adicionando a seguinte configuração de plug-
in à sua configuração Maven (pom.xml):
<projeto>
<build>
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 29/43
20/05/2021 Guia de referência do Querydsl
<build>
<plugins>
...
<plugin>
<groupId> com.mysema.maven </groupId>
<artifactId> apt-maven-plugin </artifactId>
<version> 1.1.3 </version>
<executions>
<execution>
<goals>
<goal> processo </goal>
</goals>
<configuration>
<outputDirectory> target / generated-sources / java </outputDirectory>
<processor> com.querydsl.apt.QuerydslAnnotationProcessor </processor>
</configuration>
</execution>
</ executions >
</plugin>
...
</plugins>
</build>
</project>
Substitua src por sua pasta de origem principal, gerada com sua pasta para origens geradas e construa com sua
pasta de destino.
2.9. Querying in Scala
Generic support for Querydsl usage in Scala is available via querydsl-scala module. To add it to your Maven build,
use the following snippet:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-scala</artifactId>
<version>${querydsl.version}</version>
</dependency>
//Standard Alternative
expr isNotNull expr is not(null)
expr isNull expr is null
expr eq "Ben" expr === "Ben"
expr ne "Ben" expr !== "Ben"
expr append "X" expr + "X"
expr isEmpty expr is empty
expr isNotEmpty expr not empty
// boolean
left and right left && right
left or right left || right
expr not !expr
// comparison
expr lt 5 expr < 5
expr loe 5 expr <= 5
expr gt 5 expr > 5
expr goe 5 expr >= 5
expr notBetween(2,6) expr not between (2,6)
expr negate -expr
// numeric
expr add 3 expr + 3
expr subtract 3 expr - 3
expr divide 3 expr / 3
expr multiply 3 expr * 3
expr mod 5 expr % 5
// collection
list.get(0) list(0)
map.get("X") map("X")
2.9.2.1. Code generation
Scala sources for SQL metatypes and projections can be generated with querydsl-maven-plugin. Here is an
example configuration
<project>
<build>
<plugins>
...
<plugin>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>${querydsl.version}</version>
<configuration>
<jdbcDriver>com.mysql.jdbc.Driver</jdbcDriver>
<jdbcUrl>jdbc:mysql://localhost:3306/test</jdbcUrl>
<jdbcUser>matko</jdbcUser>
<jdbcPassword>matko</jdbcPassword>
<packageName>com.example.schema</packageName>
<targetFolder>${project.basedir}/src/main/scala</targetFolder>
<exportBeans>true</exportBeans>
<createScalaSources>true</createScalaSources>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.16</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-scala</artifactId>
<version>${querydsl.version}</version>
</dependency>
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 31/43
20/05/2021 Guia de referência do Querydsl
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
</dependencies>
</plugin>
...
</plugins>
</build>
</project>
@Entity
class User {
@BeanProperty
@Id
var id: Integer = _;
@BeanProperty
var userName: String = _;
@BeanProperty
@ManyToOne
var department: Department = _;
}
@Entity
class Department {
@BeanProperty
@Id
var id: Integer = _;
@BeanProperty
nome da var: String = _;
}
Lista
Resultado único
selectFrom (pessoa)
.where (person.firstName like "Rob%" , person.lastName like "An%" )
.buscar()
Pedido
Não nulo
selectFrom (pessoa)
.onde (person.firstName isEmpty, person.lastName isNotNull)
.buscar()
Além das consultas, você precisa de variáveis que podem ser criadas assim
Nota: o suporte Scala ainda não está disponível se você usar o Hibernate com uma configuração baseada em
XML. HibernateDomainExporter atualmente só exibe arquivos de origem Java.
3. Uso geral
A seção de uso geral cobre aspectos que não são cobertos na seção tutorial da documentação de referência. Ele
segue uma estrutura orientada a casos de uso.
Expressões são normalmente construídas acessando campos e métodos de chamada nos tipos de expressão
gerados de seu módulo de domínio. Para casos em que a geração de código não é aplicável, maneiras genéricas
de construir expressões podem ser usadas.
BooleanBuilderé mutável e representa inicialmente nulo e após cada chamada and ou oro resultado da
operação.
Em geral, a Expressionsclasse deve ser usada apenas nos casos em que os formulários DSL fluentes não
podem ser usados, como caminhos dinâmicos, sintaxe personalizada ou operações personalizadas.
A seguinte expressão
Instâncias de caminho representam variáveis e propriedades, Constantes são constantes, Operações são
operações e instâncias de TemplateExpression podem ser usadas para expressar expressões como modelos de
String.
Em comparação com o Expressions API, o PathBuilder não fornece suporte direto para operações desconhecidas
ou sintaxe personalizada, mas a sintaxe é mais próxima do DSL normal.
Propriedade da string:
entityPath.getMap ( "map" , String. class , String. class , StringPath. class ) .get ( "key" ) .lower ();
Para validação do PathBuilder, um PathBuilderValidator pode ser usado. Ele pode ser injetado no construtor e
será usado transitivamente para o novo PathBuilder
3.1.4. Case expressions
To construct case-when-then-else expressions use the CaseBuilder class like this:
For case expressions with equals-operations use the following simpler form instead:
3.1.5. Casting expressions
To avoid a generic signature in expression types the type hierarchies are flattened. The result is that all generated
query types are direct subclasses of com.querydsl.core.types.dsl.EntityPathBase or
com.querydsl.core.types.dsl.BeanPath and cannot be directly cast to their logical supertypes.
Instead of a direct Java cast, the supertype reference is accessible via the _super field. A _super-field is available
in all generated query types with a single supertype:
// from Account
QAccount extends EntityPathBase<Account> {
// ...
}
// from BankAccount extends Account
QBankAccount extends EntityPathBase<BankAccount> {
public final QAccount _super = new QAccount(this);
// ...
}
To cast from a supertype to a subtype you can use the as-method of the EntityPathBase class:
3.1.6. Select literals
Literals can be selected by referring to them via Constant expressions. Here is a simple example
query.select(Expressions.constant(1),
Expressions.constant("abc"));
3.2. Result handling
Querydsl provides two ways to customize results, FactoryExpressions for row based transformation and
ResultTransformer for aggregation.
For the com querydsl core ResultTransformer interface GroupBy is the main implementation
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 34/43
20/05/2021 Guia de referência do Querydsl
For the com.querydsl.core.ResultTransformer interface GroupBy is the main implementation.
This example could also have been written via the QTuple expression class like this
3.2.2. Bean population
In cases where Beans need to be populated based on the results of the query, Bean projections can be used like
this
When fields should be directly used instead of setters the following variant can be used instead
3.2.3. Constructor usage
Constructor based row transformation can be used like this
As an alternative to the generic Constructor expression usage constructors can also be annotated with the
QueryProjection annotation:
class CustomerDTO {
@QueryProjection
public CustomerDTO(long id, String name) {
...
}
}
While the example is Hibernate specific, this feature is available in all modules.
If the type with the QueryProjection annotation is not an annotated entity type, you can use the constructor
projection like in the example, but if the annotated type would be an entity type, then the constructor projection
would need to be created via a call to the static create method of the query type:
@Entity
class Customer {
@QueryProjection
public Customer(long id, String name) {
...
}
}
Alternatively, if code generation is not an option, you can create a constructor projection like this:
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 35/43
20/05/2021 Guia de referência do Querydsl
3.2.4. Result aggregation
The com.querydsl.core.group.GroupBy class provides aggregation functionality which can be used to aggregate
query results in memory. Below are some usage examples.
This will return a map of post ids to Group instances with access to post name and comment ids.
3.3. Code generation
The Java 6 APT annotation processing functionality is used in Querydsl for code generation in the JPA, JDO and
Mongodb modules. This section describes various configuration options for the code generation and an alternative
to APT usage.
3.3.1. Path initialization
By default Querydsl initializes only reference properties of the first two levels. In cases where longer initialization
paths are required, these have to be annotated in the domain types via
com.querydsl.core.annotations.QueryInit annotations. QueryInit is used on properties where deep
initializations are needed. The following example demonstrates the usage.
@Entity
class Event {
@QueryInit("customer.address")
Account account;
}
@Entity
class Account {
Customer customer;
}
@Entity
class Customer {
String name;
Address address;
// ...
}
This example enforces the initialization of the account.customer path, when an Event path is initialized as a root
path / variable. The path initialization format supports wildcards as well, e.g. "customer.*" or just "*".
The automatic path initialization replaces the manual one, which required the entity fields to be non-final. The
declarative format has the benefit to be applied to all top level instances of a Query type and to enable the usage
of final entity fields.
Automatic path initialization is the preferred initialization strategy, but manual initialization can be activated via the
Config annotation, which is described below.
3.3.2. Customization
A serialização de Querydsl pode ser personalizada por meio de anotações de configuração em pacotes e tipos.
Eles personalizam a serialização do pacote ou tipo anotado.
Nome Descrição
Se você quiser personalizar a configuração do serializador globalmente, você pode fazer isso por meio das
seguintes opções do APT
Nome Descrição
<projeto>
<build>
<plugins>
...
<plugin>
<groupId> com.mysema.maven </groupId>
<artifactId> apt-maven-plugin </artifactId>
<version> 1.1.3 </version>
<executions>
<execution>
<goals>
<goal> processo </goal>
</goals>
<configuration>
<outputDirectory> target / generated-sources / java </outputDirectory>
<processor> com.querydsl.apt.jpa.JPAAnnotationProcessor </processor>
<options>
<querydsl.entityAccessors> true </querydsl.entityAccessors>
<querydsl.useFields> false </querydsl.useFields>
/ ti
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 37/43
20/05/2021 Guia de referência do Querydsl
</options>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
<projeto>
<build>
<plugins>
...
<plugin>
<artifactId> maven-compiler-plugin </artifactId>
<configuration>
<generatedSourcesDirectory> target / generated-sources / java </generatedSourcesDirectory>
<compilerArgs>
<arg> -Aquerydsl.entityAccessors = true </arg>
<arg > -Aquerydsl.useFields = false </arg>
</compilerArgs>
</configuration>
<dependencies>
<dependency>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-apt </artifactId>
<version> $ { querydsl.version} </version>
<classifier> jpa </classifier>
</dependency>
<dependency>
<groupId> org.hibernate.javax.persistence </groupId>
<artifactId> hibernate-jpa-2.1-api </artifactId>
<version> 1.0.0.Final </version>
</ dependency >
</dependencies>
</plugin>
...
</plugins>
</build>
</project>
Observe que você precisa usar um classificador adequado ao definir a dependência de com.querydsl:querydsl-
apt. Esses artefatos adicionais definem o processador de anotação a ser usado META-
INF/services/javax.annotation.processing.Processor.
general
hibernate
jdo
jpa
With this configuration query objects can have their sources generated and compiled during compilation of the
domain objects. This will also automatically add the generated sources directory to Maven project source roots.
The great advantage of this approach is that it can also handle annotated Groovy classes using groovy-eclipse
compiler:
<project>
<build>
<plugins>
...
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerId>groovy-eclipse-compiler</compilerId>
<generatedSourcesDirectory>target/generated-sources/java</generatedSourcesDirectory>
<compilerArgs>
<arg>-Aquerydsl.entityAccessors=true</arg>
<arg>-Aquerydsl.useFields=false</arg>
</compilerArgs>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-compiler</artifactId>
<version>2.9.1-01</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-batch</artifactId>
<version>2.3.7-01</version>
</dependency>
<dependency>
<groupId>com.querydsl </groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<classifier>jpa</classifier>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
</dependencies>
</plugin>
...
</plugins>
</build>
</project>
Time support for custom types needs to be added. Support for Date / Time types of the Joda time API and JDK
(java.util.Date, Calendar and subtypes) is built in, but other APIs might need to be supported using this feature.
@Entity
public class MyEntity {
@QueryType(PropertyType.SIMPLE)
public String stringAsSimple;
@QueryType(PropertyType.COMPARABLE)
public String stringAsComparable;
@QueryType(PropertyType.NONE)
public String stringNotInQuerydsl;
}
The value PropertyType.NONE can be used to skip a property in the query type generation. This case is different
from @Transient or @QueryTransient annotated properties, where properties are not persisted.
PropertyType.NONE just omits the property from the Querydsl query type.
3.3.4. Delegate methods
Para declarar um método estático como um método delegado, adicione a anotação QueryDelegate com o tipo de
domínio correspondente como um valor e forneça uma assinatura de método que leva o tipo de consulta Querydsl
correspondente como o primeiro argumento.
@QueryEntity
public static class User {
Nome da string;
Gerente de usuários;
}
@QueryDelegate (User.class)
public static BooleanPath isManagedBy (usuário QUser, User other) {
return user.manager.eq (other);
}
Os métodos de delegação também podem ser usados para estender os tipos internos. Aqui estão alguns
exemplos
Quando os métodos delegados são declarados para tipos integrados, são criadas subclasses com os usos de
método delegado adequados:
<projeto>
<build>
<plugins>
...
<plugin>
<groupId> com.mysema.maven </groupId>
<artifactId> apt-maven-plugin </artifactId>
<version> 1.1.3 </version>
<executions>
<execution>
<goals>
<goal> processo </goal>
</goals>
<configuration>
<outputDirectory> target / generated-sources / java </outputDirectory>
<processor> com.querydsl.apt.QuerydslAnnotationProcessor </processor>
</configuration>
</execution>
</ executions >
</plugin>
...
</plugins>
</build>
</project>
Para disponibilizar o GenericExporter, adicione uma dependência ao módulo querydsl-codegen ao seu projeto ou,
para ser mais preciso com.querydsl:querydsl-codegen:${querydsl.version}.
Isso exportará todas as classes anotadas JPA no pacote da classe DomainClass e subpacotes para o diretório
target / generated-sources / java.
boleano escada verdadeiro, se as fontes Scala devem ser geradas (padrão: falso)
boleano handleMethods true, se getters devem ser tratados como propriedades (padrão: true)
boleano testClasspath verdadeiro se o caminho de classe de teste deve ser usado em vez
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 40/43
20/05/2021 Guia de referência do Querydsl
boleano testClasspath verdadeiro, se o caminho de classe de teste deve ser usado em vez
<projeto>
<build>
<plugins>
...
<plugin>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-maven-plugin </artifactId>
<version> $ {querydsl.version} </version>
<executions>
<execution>
<phase> classes de processo </phase>
<goals>
<goal> jpa-export </goal>
</goals>
<configuration>
<targetFolder> target / generated-sources / java </targetFolder>
<packages>
<package> com.example.domain < / package>
</packages>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
Isso exportará as classes anotadas JPA do com.example.domainpacote e subpacotes para o diretório target /
generated-sources / java.
Se você precisar compilar as fontes geradas diretamente depois disso, poderá usar o compileobjetivo para isso.
<execution>
<goals>
<goal> compilar </goal>
</goals>
<configuration>
<sourceFolder> target / generated-sources / scala </targetFolder>
</configuration>
</execution>
boleano testClasspath verdadeiro, se o caminho de classe de teste deve ser usado em vez
<projeto>
<build>
<plugins>
...
<plugin>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-maven-plugin </artifactId>
<version> $ {querydsl.version} </version>
<dependencies>
<dependency>
<groupId> com.querydsl </groupId>
<artifactId> querydsl-scala </artifactId>
<version> $ {querydsl.version} </version>
</dependency>
<dependency>
<groupId> org.scala-lang </groupId>
<artifactId> scala -library </artifactId>
<version> $ {scala.version} </version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal> jpa-export </goal>
</goals>
<configuration>
t tF ld t t / t d / l /t tF ld
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 41/43
20/05/2021 Guia de referência do Querydsl
<targetFolder> target / generated-sources / scala </targetFolder>
<scala> true </scala>
<packages >
<package> com.example.domain </package>
</packages>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
Os exemplos a seguir demonstram como os objetos de alias podem ser usados como substitutos para a criação
de expressões com base nos tipos gerados.
E agora com uma instância de alias para a classe Cat. A chamada c.getKittens()dentro do método dollar é
transformada internamente no caminho da propriedade c.kittens.
Para usar a funcionalidade de alias em seu código, adicione as duas importações a seguir
O exemplo a seguir é uma variação do anterior, onde o acesso ao tamanho da lista acontece dentro da invocação
do método dollar.
Todas as propriedades digitadas não primitivas e não finais de apelidos são eles próprios apelidos. Portanto, você
pode colocar chamadas de método em cascata até atingir um tipo primitivo ou final no escopo do método dólar.
por exemplo
Observe também que você só pode invocar getters, size (), contains (Object) e get (int) em tipos de alias. Todas
as outras invocações lançam exceções.
4. Solução de problemas
Ao usar campos ou getters codificados incorretamente, você pode executar o seguinte rastreamento de pilha:
Uma solução fácil de usar é inicializar as classes em um único encadeamento antes de serem usadas em
diferentes encadeamentos.
A versão do arquivo de classe 50.0 é usada pelo Java 6.0 e 49.0 é usada pelo Java 5.0.
O Querydsl é testado apenas no JDK 6.0, pois usamos o APT extensivamente, que está disponível apenas a
partir do JDK 6.0.
Se quiser usá-lo com o JDK 5.0, você pode tentar compilar o Querydsl por conta própria.
www.querydsl.com/static/querydsl/4.4.0/reference/html_single/ 43/43