以下内容转载于
在此权作为笔记
SpringData中查询分两种,一种是基于规范的,一种是基于注解的
1. 基于查询规范
dao层查询方法:
import java.util.List;
import org.springframework.data.repository.Repository;
import com.wzw.springdata.model.Employee;
public interface EmployeeRepository extends Repository<Employee,Integer> {
public Employee getEmployeeById(Integer id);
/**
* name 以什么开始 IsStartingWith 并且 年龄<多少岁的员工 (已wang结尾的 就是findByNameIsEndingWith)
* @param name
* @param gae
* @return
*/
public List<Employee> findByNameIsStartingWithAndAgeLessThan(String name, Integer gae);
/**
* names in ('','','') 年龄小于多少
* @param names
* @param age
* @return
*/
public List<Employee> findByNameInOrAgeLessThan(List<String> names,Integer age);
}
测试方法:
@Test
public void fun3() {
System.out.println("1: " + er);
List<Employee> list = er.findByNameIsStartingWithAndAgeLessThan("test", 19);
for (Employee employee : list) {
System.out.println(employee);
}
}
运行结果:
1: org.springframework.data.jpa.repository.support.SimpleJpaRepository@bd1111a
Hibernate:
select
employee0_.id as id1_0_,
employee0_.age as age2_0_,
employee0_.name as name3_0_
from
Employee employee0_
where
(
employee0_.name like ?
)
and employee0_.age<?
Employee [id=3, name=test12, age=18]
Employee [id=4, name=test13, age=18]
Employee [id=5, name=test121, age=18]
查询规范
2. 基于注解
dao层方法:
import java.util.List;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.RepositoryDefinition;
import org.springframework.data.repository.query.Param;
import com.wzw.springdata.model.Employee;
@RepositoryDefinition(domainClass = Employee.class, idClass = Integer.class)
public interface EmployeeRepository2 {
Employee getEmployeeByName(String name);
/**
* 获取年龄最大的信息 注意 from Employee 的是类名
* @param age
* @return
*/
@Query("select o from Employee o where o.age=(select max(age) from Employee)")
List<Employee> getEmpByAge();
/**
* 获取name包含 哪些 并且年龄等于多少岁
* @param name
* @param age
* @return
*/
@Query("select o from Employee o where o.name like %?1% and o.age = ?2")
public List<Employee> querayParams(String name,Integer age);
/**
* 获取总记录数
* nativeQuery =true 表示支持本地sql查询
* @return
*/
@Query(nativeQuery = true,value = "select count(*) from employee")
public long getCount();
测试方法:
@Test
public void fun5() {
System.out.println("1: " + er);
List<Employee> list = er2.getEmpByAge();
for (Employee employee : list) {
System.out.println("2: " + employee);
}
}
@Test
public void fun6() {
System.out.println("1: " + er);
List<Employee> list = er2.querayParams("es", 18);
for (Employee employee : list) {
System.out.println("2: " + employee);
}
}
@Test
public void fun7() {
System.out.println("1: " + er);
long count = er2.getCount();
System.out.println(count);
}
注解解释
1. @Query
@Query("select o from Employee o where o.age=(select max(age) from Employee)")
SpringData中@Query主要是针对于持久层对象的操作!!
2. nativeQuery属性
@Query(nativeQuery = true,value = "select count(*) from employee")
SpringData中若想用本地Sql,请在@Query注解中设置nativeQuery属性为true