Запрос с использованием QueryDSL в Spring Data JPA
Запрос с использованием QueryDSL в Spring Data JPA

1. Введение querydsl

1.1. Пакет руководств
Язык кода:javascript
копировать
<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>
1.2. Добавьте плагины.
Язык кода:javascript
копировать
<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Создайте производный класс сущности в разделе,Позже мы будем использовать этот производный класс сущностей для создания условий динамического запроса для динамического запроса.

1.3. Ввести бобы
Язык кода:javascript
копировать
@Bean
public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
    return new JPAQueryFactory(entityManager);
}

2. Создайте класс сущности

Язык кода:javascript
копировать
@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操作就可以在指定目录中生成实体добрый。

3. Создать репозиторий

Нужно наследовать QuerydslPredicateExecutor

Язык кода:javascript
копировать
public interface QuerydslRepository extends JpaRepository<Actor, Long>, QuerydslPredicateExecutor<Actor> {

}

4. Используйте QueryDSL

4.1. Собственный dsl-запрос.
4.1.1. Прямой запрос по условиям.
Язык кода:javascript
копировать
@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));
    }
}
4.1.2. Запросить все и отсортировать по полям.
Язык кода:javascript
копировать
/**
 * Запросить все и отсортировать по полю
 */
@Test
public void testFindAll() {
    QActor qActor = QActor.actor;
    List<Actor> actorList = jpaQueryFactory.selectFrom(qActor)
            .orderBy(
                    qActor.actorAge.asc()
            )
            .fetch();
    log.info(JSONUtil.toJsonPrettyStr(actorList));
}
4.1.3. Пейджинговый запрос и сортировка по полям.
Язык кода:javascript
копировать
/**
 * Запрос пагинации и сортировка по полям
 */
@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));
}
4.1.4. Нечеткий запрос на основе условий и указания диапазона определенного поля.
Язык кода:javascript
копировать
/**
 * Нечеткий запрос на основе условий и указания диапазона определенного поля
 */
@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));
}
4.2. Интегрированный dsl-запрос jpa
4.2.1. Нечеткий запрос и страничная сортировка.
Язык кода:javascript
копировать
@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));
}
4.2.2. Динамический запрос и страничная сортировка.
Язык кода:javascript
копировать
/**
 * Динамический запрос и сортировка
 */
@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));
}

кодовый адрес

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.