主页 > 开源代码  > 

SpringData自定义操作

SpringData自定义操作
一、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:// .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 piler.source>8</maven piler.source> <maven piler.target>8</maven piler.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("徐庶,王五"); } }

标签:

SpringData自定义操作由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“SpringData自定义操作