SpringData自定义操作

发布时间:2023年12月20日

一、JPQL和SQL

查询

package com.kuang.repositories;

import com.kuang.pojo.Customer;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;

//extends CrudRepository<Customer,Long>
public interface CustomerRepository extends PagingAndSortingRepository<Customer,Long> {
    //增删查改


    //查询
    @Query("from Customer where custName=?1")
    List<Customer> findCustomerByCustName(String custName);
    //查询
    @Query("from Customer where custName=:custName")
    List<Customer> findCustomerByCustName1(@Param("custName") String custName);

}

二、规定方法名?

三、自定义操作--Query By Example

?CustomerQueryByExampleRepository.java

package com.kuang.repositories;

import com.kuang.pojo.Customer;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;

import java.util.List;


public interface CustomerQueryByExampleRepository extends PagingAndSortingRepository<Customer, Long> , QueryByExampleExecutor<Customer> {




}
QueryByExampleTest
package com.kuang.test;

import com.kuang.config.ApplicationConfig;
import com.kuang.pojo.Customer;
import com.kuang.repositories.CustomerQueryByExampleRepository;
import com.kuang.repositories.CustomerRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

@ContextConfiguration(classes = ApplicationConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class QueryByExampleTest {
    @Autowired
    private CustomerQueryByExampleRepository repository;

    @Test
    public void test01() {
        Customer customer = new Customer();
        customer.setCustName("lzl");
        customer.setCustAddress("为鲁斯");
    //通过Example构建查询条件  动态查询
        Example<Customer> of = Example.of(customer);
        List<Customer> list = (List<Customer>) repository.findAll(of);
        System.out.println(list);
    }

    /**
     * 通过匹配器 进行条件的限制
     * 简单实例 客户名称 客户地址动态查询
     *
     */
    @Test
    public void test02() {
        Customer customer = new Customer();
        customer.setCustName("徐庶");
        customer.setCustAddress("斯");
        //通过Example构建查询条件  动态查询
        ExampleMatcher matching = ExampleMatcher.matching().withIgnorePaths("custName")
                .withMatcher("custAddress", ExampleMatcher.GenericPropertyMatchers.endsWith());//针对单个条件进行设置
//                .withMatcher("custAddress", new ExampleMatcher.MatcherConfigurer<ExampleMatcher.GenericPropertyMatcher>() {
//                    @Override
//                    public void configureMatcher(ExampleMatcher.GenericPropertyMatcher matcher) {
//                        matcher.endsWith();
//                    }
//                });
              //  .withStringMatcher(ExampleMatcher.StringMatcher.ENDING);//对所有条件字符串进行结尾匹配

        Example<Customer> of = Example.of(customer,matching);
        List<Customer> list = (List<Customer>) repository.findAll(of);
        System.out.println(list);
    }
}

四、自定义操作--QueryDSL 操作方便 第三方 支持JDBC mongoDB 很多

需要导入依赖整合前面的springdata-jpa

<!--     querydsl-jpa   -->

        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>4.4.0</version>
        </dependency>

完整maven依赖还需要配置插件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springdata</artifactId>
        <groupId>com.kuang</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>02-springdata-jpa</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <querydsl.version>4.4.0</querydsl.version>
        <apt.version>1.1.3</apt.version>
    </properties>

    <dependencies>
        <!--    Junit    -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!--   hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.32.Final</version>
        </dependency>
        <!--        mysql  -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--        jpa  -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
        </dependency>
        <!--     连接池   -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

        <!--     spring -  test    -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.10</version>
            <scope>test</scope>
        </dependency>

<!--     querydsl-jpa   -->

        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
        </dependency>
    </dependencies>

<!--  这个插件是为了让程序自动生成query type (查询实体,命名方式为:"Q"+对应实体名) maven插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>${apt.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>com.querydsl</groupId>
                        <artifactId>querydsl-apt</artifactId>
                        <version>${querydsl.version}</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/queries</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                            <logOnlyOnError>true</logOnlyOnError>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>



</project>

编译一下,就出来了

需要设置为代码文件夹,才能够编译?

定义接口

package com.kuang.repositories;

import com.kuang.pojo.Customer;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;


public interface CustomerQueryDSLRepository extends PagingAndSortingRepository<Customer, Long> , QuerydslPredicateExecutor<Customer> {




}

?测试类

package com.kuang.test;

import com.kuang.config.ApplicationConfig;
import com.kuang.pojo.Customer;
import com.kuang.pojo.QCustomer;
import com.kuang.repositories.CustomerQueryDSLRepository;
import com.kuang.repositories.CustomerRepository;
import com.querydsl.core.types.dsl.BooleanExpression;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

@ContextConfiguration(classes = ApplicationConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class QueryDslTest {

    @Autowired
    private CustomerQueryDSLRepository customerQueryDSLRepository;


    @Test
    public void name() {
        QCustomer customer = QCustomer.customer;

        //通过ID查找
        BooleanExpression eq = customer.custId.eq(5L);
        System.out.println(customerQueryDSLRepository.findOne(eq));

    }


    /**
     * 查询客户名称范围
     * id > 大于
     * 地址精确
     */
    @Test
    public void test02() {
        QCustomer customer = QCustomer.customer;

        BooleanExpression be = customer.custName.in("忽忽", "刘备")
                .and(customer.custId.gt(0L))
                .and(customer.custAddress.eq("杭州"));


        System.out.println(customerQueryDSLRepository.findOne(be));

    }
}

五、自定义操作-Specifications

package com.kuang.repositories;

import com.kuang.pojo.Customer;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;


public interface CustomerSpecificationsRepository extends PagingAndSortingRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {

}
package com.kuang.test;

import com.kuang.config.ApplicationConfig;
import com.kuang.pojo.Customer;
import com.kuang.repositories.CustomerRepository;
import com.kuang.repositories.CustomerSpecificationsRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.persistence.criteria.*;
import java.util.List;

@ContextConfiguration(classes = ApplicationConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class SpecificaTest {
    @Autowired
    private CustomerSpecificationsRepository repository;

    @Test
    public void name() {
        List<Customer> all = repository.findAll(new Specification<Customer>() {
            @Override
            public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                //root from   Customer //获取列
                // CriteriaBuilder  where 设置各种条件(> < in ..)
                //query 组合 (order by ,  where )


                return null;
            }
        });

    }


    /**
     * 查询客户范围(in)
     * id > 大于
     * 地址 精确
     */
    @Test
    public void select() {
        List<Customer> all = repository.findAll(new Specification<Customer>() {
            @Override
            public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                //root from   Customer //获取列
                // CriteriaBuilder  where 设置各种条件(> < in ..)
                //query 组合 (order by ,  where )
                Path<Long> custID = root.get("custId");
                Path<String> custName = root.get("custName");
                Path<String> custAddress = root.get("custAddress");

                //参数1:为那个字段设置条件  参数2 :值
                Predicate custNameP = cb.equal(custName, "刘备");
                Predicate custIDP = cb.greaterThan(custID,0L);

                CriteriaBuilder.In<String> in = cb.in(custAddress);
                in.value("叙述").value("wangwu");
                Predicate and = cb.and(custIDP,custNameP,in);
                return and;
            }
        });
        System.out.println(all);

    }

    @Test
    public void dongtaiSQL() {
        Customer customer = new Customer();
        customer.setCustName("老六");
        customer.setCustId(0L);
        customer.setCustAddress("徐庶,王五");



    }
}

文章来源:https://blog.csdn.net/qq_53374893/article/details/134980901
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。