Spring Boot Querydsl - Yash-777/MyWorld GitHub Wiki
Basic query
List<Person> persons = queryFactory.selectFrom(person)
.where(
person.firstName.eq("John"),
person.lastName.eq("Doe"))
.fetch();
Tuple projection
List<Tuple> tuples = queryFactory.select(
person.lastName, person.firstName, person.yearOfBirth)
.from(person)
.fetch();
Example:
interface MenuRepository extends JpaRepository<Menu, Long>, JpaSpecificationExecutor<Menu>, QuerydslPredicateExecutor<Menu> {
@Autowired EntityManager entityManager;
private void getRecords(Long groupId) {
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
QMenu qMenu = QMenu.menu;
QMenu companyType = (QMenu) queryFactory.from(qMenu)
.where(qMenu.groupId.eq(groupId)).fetchFirst();
JPAQuery<Menu> qMenuQuery = new JPAQuery<Menu>(entityManager);
QMenu companyType = qMenuQuery.from(qMenu)
.where(qMenu.groupId.eq(groupId)).fetchFirst();
}
querydsl
/apt-maven-plugin provides Maven integration of the Java 6 APT functionality.
The supported goals are
com.querydsl.apt.jpa.JPAAnnotationProcessor
process - to process main sources
test-process - to process test sources
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
Annotation processor 'com.mysema.query.apt.jpa.JPAAnnotationProcessor' not found
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<!-- <classifier>apt</classifier> -->
<version>${querydsl.version}</version> <!-- 5.0.0 -->
</dependency>
</dependencies>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>process</goal> <!-- to process main sources -->
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
<options>
<querydsl.generatedAnnotationClass>javax.annotation.Generated</querydsl.generatedAnnotationClass>
</options>
<showWarnings>true</showWarnings>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<classifier>jpa</classifier> <!-- Spring 6+ <classifier>jakarta</classifier> -->
<version>${querydsl.version}</version> <!-- 5.0.0 -->
</dependency>
</dependencies>
</plugin>
@Mapper(
componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING,
unmappedTargetPolicy = org.mapstruct.ReportingPolicy.IGNORE
uses = {BaseMapper.class, GroupMapper.class, MenuMapper.class})
public interface UserMapper {
//@Mapping(target = "password" ,source = "user.password", ignore = true)
@Mapping(target = "version", source = "version", defaultValue = "0")
@Mapping(target = "mailStatus", source = "user.mailStatusFlag")
User entityToModel(com.vorwerk.dspro.entities.User user);
@Mapping(target = "mailStatusFlag", source = "mailStatus")
com.vorwerk.dspro.entities.User modelToEntity(User user);
default Status mapToStatusEnum(int value) { return Status.get(value); }
default Integer mapToInteger(Status status) { return status != null ? status.getId() : null; }
}
Click to expand! (Maven POM.xml build configuration for QueryDSL and MapStruct)
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
<options>
<querydsl.generatedAnnotationClass>javax.annotation.Generated</querydsl.generatedAnnotationClass>
</options>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<!-- <classifier>apt</classifier> -->
<version>${querydsl.version}</version> <!-- 5.0.0 -->
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
-Amapstruct.defaultComponentModel=spring
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
Querydsl JPA (jakarta) README.md
implementation '
com.querydsl:querydsl-jpa:5.0.0:jakarta
' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta
'
- The
com.querydsl.apt.jpa.JPAAnnotationProcessor
finds domain types annotated with thejavax.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.
<!-- Add necessary QueryDSL dependencies (querydsl-core, querydsl-jpa).
The Predicate class belongs to the querydsl-core module
Caused by: java.lang.ClassNotFoundException: com.querydsl.core.types.Predicate
On removing <scope>provided</scope> from com.querydsl:querydsl-jpa:5.1.0:jakarta
-->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
<classifier>jakarta</classifier>
<!-- <scope>provided</scope> -->
</dependency>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>${mysema.maven.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<!-- <logOnlyOnError>true</logOnlyOnError> -->
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
<!-- <processor>com.querydsl.apt.EntityAnnotationProcessor</processor>Annotation processor 'com.querydsl.apt.EntityAnnotationProcessor' not found -->
<!-- <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor> not found -->
<options>
<querydsl.generatedAnnotationClass>javax.annotation.Generated</querydsl.generatedAnnotationClass>
</options>
</configuration>
</execution>
</executions>
<dependencies>
<!-- QueryDSL APT (Annotation Processing) Dependency :: Configure annotation processing (querydsl-apt) to generate the Q classes. -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<classifier>jakarta</classifier>
</dependency>
</dependencies>
</plugin>