jpa通过解析方法名创建查询和使用@Query创建自定义查询
1.jpa通过解析方法名创建查询
JpaRepository会对Repository层所有未加@Query的方法名进行校验,不符合规范会报错,除非添加@Query注解;
查询方法以find | read | get 开头 ——建议统一用find开头;
格式findBy**And/Or**;findBy**NotLike等,具体参考如图:
例:
List<User> findByUserName(String username);
User findByUserNameAndPassword(String username,String password);
按方法名解析的查询方法通常只适用于单表查询,且建议where条件参数不多于三条的情况下,返回值通常上对应表的实体Bean,通常用实体类List类型;具体要看返回结果,当返回值与类型不匹配时会造成查询错误;
2.使用@Query创建自定义查询
@Qucry注解的使用非常简单,只需在声明的方法上面标注该注解,同时提供一个 JP QL查询语句即可;
查询策略:
<jpa:repositories>提供了guery-lookup-strategy 属性,用以指定查找的顺序。它有如下三 个取值:
1. create-if-not-found: 如果方法通过@Query指定了查询语句,则使用该语句实现查询, 如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该命名查询,如果两者都没有找到,则通过解析方法名字来创建查询。这是query-lookup-strategy 属性的默认值;
2.create:通过解析方法名字来创建查询。即使有符合的命名查询,或者方法通过@Query 指定的查询语句,都将会被忽略;
3.use-declared-query: 如果方法通过@Query指定了查询语句,则使用该语句实现查询, 如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该命名查询;如 果两者都没有找到,则抛出异常。
最后用之前文章的代码比较:
package com.xdja.timingDemo.dao;
import com.xdja.timingDemo.model.Cert;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
import java.util.Optional;
@Repository
public interface CertDao extends JpaRepository<Cert,Integer> {
Optional<Cert> findById(Integer Id);
List<Cert> findAll();
@Query(value = "select expire_date_time from Cert where time < '1609344000'")
List<Date> findAllDate();
@Modifying //DML操作需添加该注解
@Query(value = "delete from Cert where time < '1609344000'")
void deleteTime();
@Modifying
@Query(value = "update Cert set status = 0 where time < '1550645979'")
void updateStatus();
@Modifying
@Query(value = "update Cert set status = 0 where time < :time ")
void updateStatusByTime(@Param("time") Long time);
}