依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
实体类
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
@Column(name= "device_id") //解决对应数据库字段有下划线的情况
private Integer deviceId;
//省略getter setter constructer
}
各种 sql 情况的示例 ( JPQL类似于hibernate的hql,查询的是对象名而非表名 )
- 索引参数
/**
* ?1 ?2 表示参数的占位符,需要和方法中所传递的参数顺序一致。X是从1开始。
*/
@Query("SELECT * FROM Person p WHERE p.lastName = ?1 AND p.email = ?2")
List<Person> testQueryAnnotationParams1(String lastName, String email);
- 命名参数 (推荐使用此方式,不用管参数的顺序)
@Query("SELECT * FROM Person p WHERE p.lastName = :lastName AND p.email = :email")
List<Person> testQueryAnnotationParams2(@Param("email") String email, @Param("lastName") String lastName);
- LIKE关键字的查询
/**
* like查询 使用索引参数
*/
@Query("SELECT p FROM Person p WHERE p.lastName LIKE %?1% OR p.email LIKE %?2%")
List<Person> testQueryAnnotationLikeParam(String lastName, String email);
/**
* like查询 使用命名参数
*/
@Query("SELECT p FROM Person p WHERE p.lastName LIKE %:lastName% OR p.email LIKE %:email%")
List<Person> testQueryAnnotationLikeParam3(@Param("email") String email, @Param("lastName") String lastName);
//测试
personRepsitory.testQueryAnnotationLikeParam("A", "A@126.com");
- 原生SQL查询 (设置nativeQuery=true)
@Query(value = "SELECT count(id) FROM tb_persons", nativeQuery = true)
long getTotalCount();
- @Modifying注解
- @Transactional注解
@Transactional
@Modifying
@Query("UPDATE Person p SET p.email = :email WHERE p.id = :id")
void updatePersonEmail(@Param("id") Integer id, @Param("email") String email);
注意
1、在@Query注解中编写JPQL(@Query注解中的sql语句)实现delete和update操作的时候必须加上@modifying注解,以通知Spring Data 这是一个delete或update操作。
2、delete或者update操作需要使用事务,添加@Transactional注解即可。否则报错:Executing an update/delete query
3、注意JPQL(@Query注解中的sql语句)不支持insert操作。
2017/10/27更新
说明一个点:实体类的字段比数据库表的字段少
也是可以的.只要对应关系正确就行.
数据库表字段太多,又想用JPA操作,只需要实体类写出需要用到的字段就可以了