jpa通过解析方法名创建查询和使用@Query创建自定义查询

1.jpa通过解析方法名创建查询

JpaRepository会对Repository层所有未加@Query的方法名进行校验,不符合规范会报错,除非添加@Query注解;

查询方法以find | read | get 开头 ——建议统一用find开头;

格式findBy**And/Or**;findBy**NotLike等,具体参考如图:

jpa通过解析方法名创建查询和使用@Query创建自定义查询_第1张图片

 例:

List   findByUserName(String  username);

User  findByUserNameAndPassword(String  username,String password);

按方法名解析的查询方法通常只适用于单表查询,且建议where条件参数不多于三条的情况下,返回值通常上对应表的实体Bean,通常用实体类List类型;具体要看返回结果,当返回值与类型不匹配时会造成查询错误;

2.使用@Query创建自定义查询

@Qucry注解的使用非常简单,只需在声明的方法上面标注该注解,同时提供一个 JP QL查询语句即可;

查询策略:

提供了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 {

    Optional  findById(Integer Id);

    List findAll();

    @Query(value = "select  expire_date_time from Cert where time < '1609344000'")
    List 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);



}

 

你可能感兴趣的:(Java,SpringBoot,jpa)