按照上一篇文章 咱们知道 咱们定义的方法 都要根据它的规范进行定义 否则就无法实用java
这篇咱们讲@Query 查询注解 咱们就能够不须要遵循它的方法规则去编写 我们讲@Query定义到方法上便可 下面我们经过例子来说spring
本案例对应的方法------------------> getEmployeeByAge 这里咱们能够定义本身的sql sql
package org.springdata.repository; import org.springdata.domain.Employee; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import org.springframework.data.repository.RepositoryDefinition; import java.util.List; /*** * */ @RepositoryDefinition(domainClass = Employee.class, idClass = Integer.class) public interface EmployeeRepository /*extends Repository<Employee,Integer>*/ { /** * 根据名字找员工 * desc 你们能够发现 我只声明了一个方法 并无写任何的实现类 哦了 就这样 我们写个实现类 * @param name * @return */ public Employee findByName(String name); // name 根据模糊查询 而且 年龄<多少岁的员工 public List<Employee> findByNameIsStartingWithAndAgeLessThan(String name, Integer gae); // names in ('','','') 年龄小于多少 public List<Employee> findByNameInOrAgeLessThan(List<String> names,Integer age); //获取年龄最大的信息 注意 from Employee 的是类名 不是表名 @Query(" select o from Employee o where o.age=(select max(age) from Employee t1)") public Employee getEmployeeByAge(); }
测试类 数据库
对应的方法 ---------->testgetEmployeeByAgedom
package org.springdata; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springdata.domain.Employee; import org.springdata.repository.EmployeeRepository; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.ArrayList; import java.util.List; /** * 测试类 */ public class SpringDataTest { private ApplicationContext ctx = null; private EmployeeRepository employeeRepository = null; @Before public void setup(){ ctx = new ClassPathXmlApplicationContext("beans_news.xml"); employeeRepository = ctx.getBean(EmployeeRepository.class); System.out.println("setup"); } @After public void tearDown(){ ctx = null; System.out.println("tearDown"); } @Test public void testEntityManagerFactory(){ } @Test public void testFindByName(){ System.out.println(employeeRepository); Employee employee = employeeRepository.findByName("zhangsan"); System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } @Test public void testfindByNameIsStartingWithAndAgeLessThan(){ System.out.println(employeeRepository); List<Employee> employees = employeeRepository.findByNameIsStartingWithAndAgeLessThan("wang",50); for (Employee employee: employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testfindByNameInOrAgeLessThan(){ List<String> names = new ArrayList<String>(); names.add("wangwu1"); names.add("wangwu2"); names.add("wangwu3"); System.out.println(employeeRepository); List<Employee> employees = employeeRepository.findByNameInOrAgeLessThan(names,50); for (Employee employee: employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testgetEmployeeByAge(){ Employee employee = employeeRepository.getEmployeeByAge(); System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } }
输出结果测试
我们看下数据库表最大的年龄是否是这条记录spa
再来一个 仍是在 EmployeeRepository 加方法code
//获取name包含 哪些 而且年龄等于多少岁 @Query("select o from Employee o where o.name like %?1% and o.age = ?2") public List<Employee> querayParams(String name,Integer age);
而后编写测试类xml
@Test public void tesquerayParams(){ List<Employee> employees = employeeRepository.querayParams("wangwu",12); for (Employee employee: employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } }
看下输出结果blog
very good 就那么简单