APT-based source code generation tool for Querydsl that generates type-safe query classes from annotated Java entity classes.
—
APT compiler options for controlling code generation behavior, naming conventions, and processing rules. These options are passed to annotation processors via build tool configuration (Maven, Gradle) or IDE settings.
Central constants defining all supported annotation processing options.
/**
* APT options supported by Querydsl annotation processors
*/
public final class APTOptions {
// Naming configuration
public static final String QUERYDSL_PREFIX = "querydsl.prefix";
public static final String QUERYDSL_SUFFIX = "querydsl.suffix";
public static final String QUERYDSL_PACKAGE_SUFFIX = "querydsl.packageSuffix";
// Code generation options
public static final String QUERYDSL_CREATE_DEFAULT_VARIABLE = "querydsl.createDefaultVariable";
public static final String QUERYDSL_ENTITY_ACCESSORS = "querydsl.entityAccessors";
public static final String QUERYDSL_LIST_ACCESSORS = "querydsl.listAccessors";
public static final String QUERYDSL_MAP_ACCESSORS = "querydsl.mapAccessors";
// Property discovery options
public static final String QUERYDSL_USE_FIELDS = "querydsl.useFields";
public static final String QUERYDSL_USE_GETTERS = "querydsl.useGetters";
public static final String QUERYDSL_UNKNOWN_AS_EMBEDDABLE = "querydsl.unknownAsEmbeddable";
// Inclusion/exclusion options
public static final String QUERYDSL_EXCLUDED_PACKAGES = "querydsl.excludedPackages";
public static final String QUERYDSL_EXCLUDED_CLASSES = "querydsl.excludedClasses";
public static final String QUERYDSL_INCLUDED_PACKAGES = "querydsl.includedPackages";
public static final String QUERYDSL_INCLUDED_CLASSES = "querydsl.includedClasses";
// Advanced configuration
public static final String QUERYDSL_VARIABLE_NAME_FUNCTION_CLASS = "querydsl.variableNameFunctionClass";
}Control the naming conventions for generated query classes and their components.
// Class name prefix (default: empty string)
public static final String QUERYDSL_PREFIX = "querydsl.prefix";
// Class name suffix (default: "Q")
public static final String QUERYDSL_SUFFIX = "querydsl.suffix";
// Package suffix for generated classes (default: empty)
public static final String QUERYDSL_PACKAGE_SUFFIX = "querydsl.packageSuffix";Usage Examples:
<!-- Maven APT plugin configuration -->
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<configuration>
<options>
<!-- Generate QUser, QProduct, etc. (default) -->
<querydsl.prefix></querydsl.prefix>
<querydsl.suffix>Q</querydsl.suffix>
<!-- Alternative: Generate QueryUser, QueryProduct -->
<querydsl.prefix>Query</querydsl.prefix>
<querydsl.suffix></querydsl.suffix>
<!-- Put generated classes in separate package -->
<querydsl.packageSuffix>.query</querydsl.packageSuffix>
</options>
</configuration>
</plugin>Naming Results:
prefix="", suffix="Q"): User → QUserprefix="Query", suffix=""): User → QueryUsercom.example.model.User → com.example.model.query.QUserControl the structure and features of generated query classes.
// Create static default variable instances (default: true)
public static final String QUERYDSL_CREATE_DEFAULT_VARIABLE = "querydsl.createDefaultVariable";
// Generate entity accessor methods (default: false)
public static final String QUERYDSL_ENTITY_ACCESSORS = "querydsl.entityAccessors";
// Generate list-specific accessor methods (default: false)
public static final String QUERYDSL_LIST_ACCESSORS = "querydsl.listAccessors";
// Generate map-specific accessor methods (default: false)
public static final String QUERYDSL_MAP_ACCESSORS = "querydsl.mapAccessors";Code Generation Examples:
// With QUERYDSL_CREATE_DEFAULT_VARIABLE=true (default)
public class QUser extends EntityPathBase<User> {
public static final QUser user = new QUser("user"); // Default variable created
// ... properties
}
// With QUERYDSL_CREATE_DEFAULT_VARIABLE=false
public class QUser extends EntityPathBase<User> {
// No static default variable
public QUser(String variable) { super(User.class, variable); }
// ... properties
}
// With QUERYDSL_ENTITY_ACCESSORS=true
public class QUser extends EntityPathBase<User> {
// Standard properties
public final StringPath name = createString("name");
public final ListPath<Order, QOrder> orders = this.<Order, QOrder>createList("orders", Order.class, QOrder.class, PathInits.DIRECT2);
// Additional entity accessor methods generated
public QOrder orders() { return new QOrder(forProperty("orders")); }
public QOrder orders(int index) { return new QOrder(forProperty("orders", index)); }
}Configure how annotation processors discover entity properties from source code.
// Process field declarations (default: true)
public static final String QUERYDSL_USE_FIELDS = "querydsl.useFields";
// Process getter methods (default: true)
public static final String QUERYDSL_USE_GETTERS = "querydsl.useGetters";
// Treat unknown referenced types as embeddable (default: false)
public static final String QUERYDSL_UNKNOWN_AS_EMBEDDABLE = "querydsl.unknownAsEmbeddable";Property Discovery Modes:
<!-- Process both fields and getters (default) -->
<querydsl.useFields>true</querydsl.useFields>
<querydsl.useGetters>true</querydsl.useGetters>
<!-- Fields only (ignore getter methods) -->
<querydsl.useFields>true</querydsl.useFields>
<querydsl.useGetters>false</querydsl.useGetters>
<!-- Getters only (ignore field declarations) -->
<querydsl.useFields>false</querydsl.useFields>
<querydsl.useGetters>true</querydsl.useGetters>Unknown Type Handling:
@Entity
public class User {
private CustomType customProperty; // Unknown type
}
// With QUERYDSL_UNKNOWN_AS_EMBEDDABLE=false (default)
// CustomType ignored unless explicitly annotated
// With QUERYDSL_UNKNOWN_AS_EMBEDDABLE=true
// CustomType treated as embeddable, QCustomType generated if possibleFine-grained control over which packages and classes are processed.
// Comma-separated list of packages to exclude from processing
public static final String QUERYDSL_EXCLUDED_PACKAGES = "querydsl.excludedPackages";
// Comma-separated list of classes to exclude from processing
public static final String QUERYDSL_EXCLUDED_CLASSES = "querydsl.excludedClasses";
// Comma-separated list of packages to include (whitelist mode)
public static final String QUERYDSL_INCLUDED_PACKAGES = "querydsl.includedPackages";
// Comma-separated list of classes to include (whitelist mode)
public static final String QUERYDSL_INCLUDED_CLASSES = "querydsl.includedClasses";Exclusion Examples:
<!-- Exclude specific packages -->
<querydsl.excludedPackages>com.example.internal,com.example.test</querydsl.excludedPackages>
<!-- Exclude specific classes -->
<querydsl.excludedClasses>com.example.TempEntity,com.example.DebugEntity</querydsl.excludedClasses>
<!-- Whitelist mode - only process specified packages -->
<querydsl.includedPackages>com.example.model,com.example.domain</querydsl.includedPackages>
<!-- Whitelist mode - only process specified classes -->
<querydsl.includedClasses>com.example.User,com.example.Product</querydsl.includedClasses>Processing Rules:
startsWith() matching for package exclusionsSpecialized options for advanced customization scenarios.
// Custom variable name function class (default: DefaultVariableNameFunction)
public static final String QUERYDSL_VARIABLE_NAME_FUNCTION_CLASS = "querydsl.variableNameFunctionClass";Custom Variable Naming:
// Implement custom variable naming strategy
public class CustomVariableNameFunction implements Function<EntityType, String> {
@Override
public String apply(EntityType entityType) {
String className = entityType.getSimpleName();
// Convert PascalCase to camelCase and make plural
return className.substring(0, 1).toLowerCase() +
className.substring(1) + "s";
}
}
// Configuration
<querydsl.variableNameFunctionClass>com.example.CustomVariableNameFunction</querydsl.variableNameFunctionClass>
// Result: User entity gets variable name "users" instead of "user"
public static final QUser users = new QUser("users");Maven Integration:
<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>
<processors>
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
</processors>
<options>
<querydsl.suffix>Q</querydsl.suffix>
<querydsl.packageSuffix>.query</querydsl.packageSuffix>
<querydsl.useFields>true</querydsl.useFields>
<querydsl.useGetters>false</querydsl.useGetters>
<querydsl.excludedPackages>com.example.internal</querydsl.excludedPackages>
</options>
</configuration>
</execution>
</executions>
</plugin>Gradle Integration:
compileJava {
options.annotationProcessorPath = configurations.annotationProcessor
options.compilerArgs += [
'-Aquerydsl.suffix=Q',
'-Aquerydsl.packageSuffix=.query',
'-Aquerydsl.useFields=true',
'-Aquerydsl.useGetters=false'
]
}IDE Integration:
Most IDEs automatically discover and apply annotation processor options from build configuration. For manual IDE configuration, add the options to the annotation processing settings using the -A prefix (e.g., -Aquerydsl.suffix=Q).
Install with Tessl CLI
npx tessl i tessl/maven-com-mysema-querydsl--querydsl-apt