一、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("徐庶,王五");
}
}