<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<!-- querydsl -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<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>
Функция плагина заключается в преобразовании@Entity
Аннотированный класс сущности находится по указанному пути.target/generated-sources/java
Создайте производный класс сущности в разделе,Позже мы будем использовать этот производный класс сущностей для создания условий динамического запроса для динамического запроса.
@Bean
public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
return new JPAQueryFactory(entityManager);
}
@Entity
@Table(name = "actor")
@Data
public class Actor {
/**
* Первичный ключ генерируется с использованием метода автоматического приращения базы данных, такого как MySQL AUTO_INCREMENT.
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "actor_name", nullable = false, length = 128, unique = true)
private String actorName;
@Column(name = "actor_age", nullable = false)
private int actorAge;
@Column(name = "actor_email", length = 64, unique = true)
private String actorEmail;
@Column(name = "create_time", nullable = false, length = 32)
private String createTime = DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss SSS");
}
в случаеIDEA
инструмент,осуществлятьMaven
плагинcompile
может быть сгенерирован в указанном каталогеQActor
добрый。
в случаеEclipse
,Щелкните правой кнопкой мыши по проекту,осуществлятьmaven
изupdate
操作就可以在指定目录中生成实体добрый。
Нужно наследовать QuerydslPredicateExecutor
public interface QuerydslRepository extends JpaRepository<Actor, Long>, QuerydslPredicateExecutor<Actor> {
}
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class QuerydslTest {
@Autowired
private JPAQueryFactory jpaQueryFactory;
/**
* Запрос напрямую на основе условий
*/
@Test
public void testFindByActorNameAndActorEmail() {
QActor qActor = QActor.actor;
Actor actor = jpaQueryFactory.selectFrom(qActor)
.where(
qActor.actorName.eq("Гао Юнхань"),
qActor.actorEmail.eq("123456789@qq.com")
)
.fetchOne();
log.info(JSONUtil.toJsonPrettyStr(actor));
}
}
/**
* Запросить все и отсортировать по полю
*/
@Test
public void testFindAll() {
QActor qActor = QActor.actor;
List<Actor> actorList = jpaQueryFactory.selectFrom(qActor)
.orderBy(
qActor.actorAge.asc()
)
.fetch();
log.info(JSONUtil.toJsonPrettyStr(actorList));
}
/**
* Запрос пагинации и сортировка по полям
*/
@Test
public void testFindByPagination() {
int page = 0; // Какая страница
int pageSize = 10; // размер страницы
QActor qActor = QActor.actor;
QueryResults<Actor> actorQueryResults = jpaQueryFactory.selectFrom(qActor)
.orderBy(
qActor.actorAge.asc()
)
.offset(page)
.limit(pageSize)
.fetchResults();
// Получить параметры пагинации
long total = actorQueryResults.getTotal();
long totalPage = (total % pageSize == 0) ? (total / pageSize) : (total / pageSize + 1);
log.info("Пагинация страницы запроса: [{}], pageSize: [{}], всего: [{}] данных, всего: [{}] страниц", page, pageSize, total, totalPage);
List<Actor> actorListByPagination = actorQueryResults.getResults();
log.info(JSONUtil.toJsonPrettyStr(actorListByPagination));
}
/**
* Нечеткий запрос на основе условий и указания диапазона определенного поля
*/
@Test
public void testFindByLikeNameAndEmailAndBetweenAgeOrderById() {
QActor qActor = QActor.actor;
List<Actor> actorList = jpaQueryFactory.selectFrom(qActor)
.where(
qActor.actorName.like("name%"),
qActor.actorEmail.like("email%"),
qActor.actorAge.between(20, 50)
)
.orderBy(
qActor.id.asc()
)
.fetch();
log.info(JSONUtil.toJsonPrettyStr(actorList));
}
@Autowired
private QuerydslRepository querydslRepository;
/**
* Нечеткий запрос и сортировка по Пагинация
*/
@Test
public void testFindByActorNameAndActorEmailPagination() {
int page = 0; // Какая страница
int pageSize = 10; // размер страницы
QActor qActor = QActor.actor;
// Нечеткие условия запроса
BooleanExpression expression = qActor.actorName.like("name%").and(qActor.actorEmail.like("email%"));
// Параметры сортировки, пагинации
Sort sort = new Sort(Sort.Direction.DESC, "actorAge");
PageRequest pageRequest = PageRequest.of(page < 0 ? 0 : page, pageSize, sort);
Page<Actor> actorPage = querydslRepository.findAll(expression, pageRequest);
log.info("Пагинация страницы запроса: [{}], pageSize: [{}], всего: [{}] данных, всего: [{}] страниц", page, pageSize, actorPage.getTotalElements(), actorPage.getTotalPages());
List<Actor> actorListByPagination = actorPage.getContent();
log.info(JSONUtil.toJsonPrettyStr(actorListByPagination));
}
/**
* Динамический запрос и сортировка
*/
@Test
public void testFindByDynamicQuery() {
Integer actorAge = 45;
String actorEmail = "email";
String actorName = null;
String createTime = "2020-11-21";
int page = 0; // Какая страница
int pageSize = 10; // размер страницы
QActor qActor = QActor.actor;
// Инициализируйте условия сборки (аналогично тому, где 1=1)
Predicate predicate = qActor.isNotNull().or(qActor.isNull());
//Выполняем сборку динамических условий
// равный
predicate = actorAge == null ? predicate : ExpressionUtils.and(predicate, qActor.actorAge.eq(actorAge));
// like нечеткое соответствие
predicate = actorEmail == null ? predicate : ExpressionUtils.and(predicate, qActor.actorEmail.like(actorEmail + "%"));
predicate = actorName == null ? predicate : ExpressionUtils.and(predicate, qActor.actorName.like(actorName + "%"));
// содержит, что эквивалентно подобному %xxx%
predicate = createTime == null ? predicate : ExpressionUtils.and(predicate, qActor.createTime.contains(createTime));
// Параметры сортировки, пагинации
Sort sort = new Sort(Sort.Direction.ASC, "id");
PageRequest pageRequest = PageRequest.of(page < 0 ? 0 : page, pageSize, sort);
Page<Actor> actorPage = querydslRepository.findAll(predicate, pageRequest);
log.info("Пагинация страницы запроса: [{}], pageSize: [{}], всего: [{}] данных, всего: [{}] страниц", page, pageSize, actorPage.getTotalElements(), actorPage.getTotalPages());
List<Actor> actorListByPagination = actorPage.getContent();
log.info(JSONUtil.toJsonPrettyStr(actorListByPagination));
}