5.模糊查询
表达式 匹配 不匹配
E.name LIKE ‘张%’ 张三 小张伟
E.name LIKE ‘张_’ 张三 张三丰
E.name LIKE ‘张_%’ 张_三 张三
示例:查询张性的所有雇员
@Query("SELECT E FROM Employee E WHERE E.name LIKE '张%'") List<Employee> selectExample();
6.空集合查询
通过使用关键字 IS [NOT] EMPTY 来查找关联的属性集合的值为空的记录 。
示例:查找尚无雇员的所有部门
@Query("SELECT D FROM Department D WHERE D.employees IS EMPTY") List<Department> selectExample();
7.构造器
查询结果的类型如果不是持久化的实体类 , 必须使用该类的完全限定名 。
语法: SELECT NEW 类的完全限定名(参数1, 参数2, …) …
示例:查询所有的雇员信息
package org.fanlychie.model; public class SimpleEmployee{ private String name; private Sex sex; public SimpleEmployee(String name, Sex sex){ this.name = name; this.sex = sex; } // getters and setters } @Query("SELECT NEW org.fanlychie.model.SimpleEmployee(E.name, E.sex) FROM Employee E") List<SimpleEmployee> selectExample();
b.更新
示例:更新某个雇员的婚姻状态和薪资信息
@Modifying @Transactional @Query("UPDATE Employee SET married = ?2, salary = ?3 WHERE id = ?1") int updateExample(Long id, Boolean married, Double salary);
@Query 无法进行 DML (Data Manipulation Language 数据操控语言 , 主要语句有 INSERT 、 DELETE 、 UPDATE )操作 , 如需更新数据库表的数据需要标注 @Modifying 注解 , 并且需要事务的支持 @Transactional 。
c.删除
示例:删除没有雇员的部门信息
@Modifying @Transactional @Query("DELETE FROM Department D WHERE D.employees IS EMPTY") int deleteExample();
以下是实际中举例:
package com.example.demo.repository; import com.example.demo.pojo.Admin; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.stereotype.Repository; //声明为repository @Repository public interface AdminRepository extends PagingAndSortingRepository<Admin,Long> { //自定义SQL语句必须在事务环境下运行 必须有DML支持(Modifying) //?1表示下面的形参的第1个位置,这里不对表进行操作,直接对实体类进行操作,然后实体类映射到表中。 //这个注解也可以加到测试类上面 但需要跟进一个@commit提交事务的注解 因为测试类会自动回滚事务 @Transactional @Modifying @Query("update Admin set password=?1 where id=?2") int updatePasswordById(String newPassword,int id); }
(3)原生SQL
说明: 如果不习惯JQPL可以使用原生SQL,这就和平时写SQL一样就不多介绍了
package com.example.demo.repository; import com.example.demo.pojo.Admin; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.stereotype.Repository; //声明为repository @Repository public interface AdminRepository extends PagingAndSortingRepository<Admin,Long> { @Transactional @Modifying //唯一不同就是多了nativeQuery参数为true,开启原生SQL @Query(value = "update account set password=?1 where name=?2",nativeQuery = true) int updatePasswordByUsername(String password,String username); }
2.命名规则表
说明: 命名规则按下面这个表就可以了