SpringData自定义操作
2023-12-16 21:39:22
    		一、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
?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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!