Spring Data JPA 학습 노트(1)중국어 수첩

13555 단어 JAVA
Spring Data JPA-중국어 매 뉴 얼
참고 문서:http://blog.csdn.net/liuchuanhong1/article/details/70244261?utm_source=gold_browser_extensionhttps://docs.spring.io/spring-data/jpa/docs/1.11.9.RELEASE/reference/html/#specificationshttps://www.v2ex.com/t/350737
프로젝트 에 spring data jpa 사용 하기
@EnableJpaRepositories
class Config {}

검색 방법의 생 성 정책 Query lookup strategies
  • CREATE 는 방법의 이름 에 따라 해당 하 는 검색 어 를 직접 만 듭 니 다
  • USE_DECLARED_QUERY 는 성명 의 조회 문 구 를 사용 합 니 다.성명 문 구 를 찾 을 때마다 이상 한 문 구 를 던 집 니 다.성명 문 구 를 사용 합 니 다@NamedQuery
  • CREATE_IF_NOT_FOUND 는 먼저 설 명 된 쿼 리 문 구 를 찾 습 니 다.다시 만 들 때마다 기본 정책
  • 입 니 다.
    방법 명 을 통 해 문장 을 정의 하 다
    public interface PersonRepository extends Repository {
    
      //    distinct    
      List findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
      List findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
    
      //           IgnoreCase
      List findByLastnameIgnoreCase(String lastname);
      //                     IgnoreCase
      List findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
    
      // Order By   
      List findByLastnameOrderByFirstnameAsc(String lastname);
      List findByLastnameOrderByFirstnameDesc(String lastname);
      
      //Person    Address, Address  zipCode  ,    zipCode   Persion
      List findByAddressZipCode(ZipCode zipCode);
      //             ,    _         ,         
      List findByAddress_ZipCode(ZipCode zipCode);
      
      
      //          Limiting query results
      User findFirstByOrderByLastnameAsc();
      User findTopByOrderByAgeDesc();
      
      Page queryFirst10ByLastname(String lastname, Pageable pageable);
      Slice findTop3ByLastname(String lastname, Pageable pageable);
      
      List findFirst10ByLastname(String lastname, Sort sort);
      List findTop10ByLastname(String lastname, Pageable pageable);
      
      //    ,            Async query results
      @Async
      Future findByFirstname(String firstname);
      @Async
      CompletableFuture findOneByFirstname(String firstname);
      @Async
      ListenableFuture findOneByLastname(String lastname);    
    }
    

    모든 생 성 된 Repository 에 추가 방법 을 추가 합 니 다.
    1.인 터 페 이 스 를 설명 하고 추가 할 방법 을 정의 합 니 다.
    @NoRepositoryBean
    public interface MyRepository
      extends PagingAndSortingRepository {
    
      void sharedCustomMethod(ID id);
    }
    

    2.정 의 된 인터페이스 구현
    public class MyRepositoryImpl
      extends SimpleJpaRepository implements MyRepository {
    
      private final EntityManager entityManager;
    
      public MyRepositoryImpl(JpaEntityInformation entityInformation,
                              EntityManager entityManager) {
        super(entityInformation, entityManager);
    
        // Keep the EntityManager around to used from the newly introduced methods.
        this.entityManager = entityManager;
      }
    
      public void sharedCustomMethod(ID id) {
        // implementation goes here
      }
    }
    

    3.구현 클래스 설정
    @Configuration
    @EnableJpaRepositories(repositoryBaseClass = MyRepositoryImpl.class)
    class ApplicationConfiguration { … }
    

    Web support
    @Configuration
    @EnableWebMvc
    @EnableSpringDataWebSupport
    class WebConfiguration { }
    
    @EnableSpringDataWebSupport일부 구성 요 소 를 열 것 입 니 다.구체 적 으로 소스 코드 를 열 어 볼 수 있 습 니 다.
  • PageableHandlerMethodArgumentResolver매개 변 수 를 통 해 컨트롤 러 page->Page you want to retrieve,0 indexed and defaults to 0.|size->Size of the page you want to retrieve,defaults to 20.|
  • Pageable매개 변 수 를 통 해 컨트롤 러 sort->Properties that should be sorted by the format property,property(,ASC|DESC)에 자동 으로 주입SortHandlerMethodArgumentResolver대상 을 컨트롤 러 sort->Properties 로 주입 할 수 있 습 니 다.default sort direction is ascending.sort=firstname&sort=lastname,asc. |
  • Sort한 대상 Id 에 들 어가 면 바로 필요 대상 으로 전환
  •  @Controller
        @RequestMapping("/users")
        public class UserController {
        
          @Autowired UserRepository repository;
        
          @RequestMapping
          public String showUsers(Model model, Pageable pageable) {
        
            model.addAttribute("users", repository.findAll(pageable));
            return "users";
          }
        }
    

    컨트롤 러 에 Pageable 대상 을 주입 해 야 할 경우 접두사,밑줄 구분 을 정의 할 수 있 습 니 다.eg:DomainClassConverter
    public String showUsers(Model model,
          @Qualifier("foo") Pageable first,
          @Qualifier("bar") Pageable second) { … }
    
    @Qualifier기본 페이지 를 설정 합 니 다.전단 에 페이지 정보 가 들 어 오지 않 으 면 기본 페이지 를 설정 할 수 있 습 니 다.기본 값 은foo_page=1입 니 다.
    Supported keywords inside method names
    Keyword
    Sample
    JPQL snippet
    And
    findByLastnameAndFirstname
    … where x.lastname = ?1 and x.firstname = ?2
    Or
    findByLastnameOrFirstname
    … where x.lastname = ?1 or x.firstname = ?2
    Is,Equals
    findByFirstname,findByFirstnameIs,findByFirstnameEquals
    … where x.firstname = ?1
    Between
    findByStartDateBetween
    … where x.startDate between ?1 and ?2
    LessThan
    findByAgeLessThan
    … where x.age < ?1
    LessThanEqual
    findByAgeLessThanEqual
    … where x.age <= ?1
    GreaterThan
    findByAgeGreaterThan
    … where x.age > ?1
    GreaterThanEqual
    findByAgeGreaterThanEqual
    … where x.age >= ?1
    After
    findByStartDateAfter
    … where x.startDate > ?1
    Before
    findByStartDateBefore
    … where x.startDate < ?1
    IsNull
    findByAgeIsNull
    … where x.age is null
    IsNotNull,NotNull
    findByAge(Is)NotNull
    … where x.age not null
    Like
    findByFirstnameLike
    … where x.firstname like ?1
    NotLike
    findByFirstnameNotLike
    … where x.firstname not like ?1
    StartingWith
    findByFirstnameStartingWith
    … where x.firstname like ?1 (parameter bound with appended %)
    EndingWith
    findByFirstnameEndingWith
    … where x.firstname like ?1 (parameter bound with prepended %)
    Containing
    findByFirstnameContaining
    … where x.firstname like ?1 (parameter bound wrapped in %)
    OrderBy
    findByAgeOrderByLastnameDesc
    … where x.age = ?1 order by x.lastname desc
    Not
    findByLastnameNot
    … where x.lastname <> ?1
    In
    findByAgeIn(Collection ages)
    … where x.age in ?1
    NotIn
    findByAgeNotIn(Collection ages)
    … where x.age not in ?1
    True
    findByActiveTrue()
    … where x.active = true
    False
    findByActiveFalse()
    … where x.active = false
    IgnoreCase
    findByFirstnameIgnoreCase
    … where UPPER(x.firstame) = UPPER(?1)
    사용@PageableDefault성명 문
    public interface UserRepository extends JpaRepository {
    
      @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
        countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
        nativeQuery = true)
      Page findByLastname(String lastname, Pageable pageable);
    }
    

    Using SpEL expressions
    public interface UserRepository extends JpaRepository {
    
      @Query("select u from #{#entityName} u where u.lastname = ?1")
      List findByLastname(String lastname);
    }
    
    new PageRequest(0, 20)실체 류 의 이름 을 나타 낸다.
    조회 알림 을 사용 합 니 다.구체 적 인 조회 알림 의 값 은 JPA 바 텀 실습 프레임 워 크 에 따라 제 공 됩 니 다.
    public interface UserRepository extends Repository {
    
      @QueryHints(value = { @QueryHint(name = "name", value = "value")},
                  forCounting = false)
      Page findByLastname(String lastname, Pageable pageable);
    }
    

    사용자 정의 검색 반환 결과
    1.인 터 페 이 스 를 정의 하 는 방식 으로 데 이 터 를 되 돌려 줍 니 다.
    만약 실체 대상:
    class Person {
      @Id UUID id;
      String firstname, lastname;
      Address address;
    
      static class Address {
        String zipCode, city, street;
      }
    }
    

    인 터 페 이 스 를 이렇게 정의 할 수 있 습 니 다:
    interface PersonSummary {
      String getFirstname();
      String getLastname();
      AddressSummary getAddress();
    
      interface AddressSummary {
        String getCity();
      }
    }
    

    검색 방법의 정의:
    interface PersonRepository extends Repository {
      Collection findByLastname(String lastname);
    }
    

    이렇게 하면 사용자 정의 조 회 를 완성 할 수 있 고 다른 방식 으로 인 터 페 이 스 를 정의 할 수 있다.
    interface NamesOnly {
    
      @Value("#{target.firstname + ' ' + target.lastname}")
      String getFullName();
      …
    }
    
    @QueryentityName을 조합 하면 돌아 오 는 대상 은firstname변수 로 대 체 됩 니 다.더 복잡 한 프로 그래 밍 을 하려 면 아래 방법 을 사용 하고 default 를 사용 하여 방법 을 정의 할 수 있 습 니 다.
    interface NamesOnly {
    
      String getFirstname();
      String getLastname();
    
      default String getFullName() {
        //         ,    ApplicationContext    bean       
        return getFirstname.concat(" ").concat(getLastname());
      }
    }
    

    용기 에 있 는 Bean 을 호출 하여 결 과 를 되 돌려 주 는 다른 방식lastname
    @Component
    class MyBean {
    
      String getFullName(Person person) {
        …
      }
    }
    
    interface NamesOnly {
    
      @Value("#{@myBean.getFullName(target)}")
      String getFullName();
      …
    }
    

    방법 중의 인 자 를 사용 하려 면 이런 방식 을 사용 할 수 있다.
    interface NamesOnly {
    
      @Value("#{args[0] + ' ' + target.firstname + '!'}")
      String getSalutation(String prefix);
    }
    
    targeti 표시 방법 중 몇 번 째
    2.DTO 를 정의 하 는 방식 으로 데 이 터 를 되 돌려 줍 니 다.
    이 방식 의 바 텀 은 DTO 가 노출 된 구조 에 따 른 매개 변수 이름 에 따라 필요 한 필드 정의 DTO 를 불 러 옵 니 다.
    class NamesOnly {
      private final String firstname, lastname;
    
      NamesOnly(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
      }
      String getFirstname() {
        return this.firstname;
      }
      String getLastname() {
        return this.lastname;
      }
      // equals(…) and hashCode() implementations
    }
    

    정 의 된 Repository
    interface PersonRepository extends Repository {
      Collection findByLastname(String lastname, Class type);
    }
    

    사용 방식 은 다음 과 같 습 니 다.
    void someMethod(PersonRepository people) {
      Collection aggregates = people.findByLastname("Matthews", Person.class);
      Collection aggregates = people.findByLastname("Matthews", NamesOnly.class);
    }
    

    저장 프로시저 사용
    참고:https://docs.spring.io/spring-data/jpa/docs/1.11.9.RELEASE/reference/html/#jpa.stored-procedures
    Specifications
    public class CustomerSpecs {
    
      public static Specification isLongTermCustomer() {
        return new Specification() {
          public Predicate toPredicate(Root root, CriteriaQuery> query,
                CriteriaBuilder builder) {
    
             LocalDate date = new LocalDate().minusYears(2);
             return builder.lessThan(root.get(_Customer.createdAt), date);
          }
        };
      }
    
      public static Specification hasSalesOfMoreThan(MontaryAmount value) {
        return new Specification() {
          public Predicate toPredicate(Root root, CriteriaQuery> query,
                CriteriaBuilder builder) {
    
             // build query here
          }
        };
      }
    }
    
    List customers = customerRepository.findAll(isLongTermCustomer());
    

    Locking
    interface UserRepository extends Repository {
      // Plain query method
      @Lock(LockModeType.READ)
      List findByLastname(String lastname);
    }
    

    Auditing
    제 공 된 주해,실체 에 추가:@myBean,args[i],@CreatedBy,@LastModifiedBy인터페이스 구현@CreatedDate@LastModifiedDate,AuditorAware설정 값 입 니 다.
    class SpringSecurityAuditorAware implements AuditorAware {
      public User getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null || !authentication.isAuthenticated()) {
          return null;
        }
        return ((MyUserDetails) authentication.getPrincipal()).getUser();
      }
    }
    

    마지막 으로 실체 에 주석 추가@CreatedBy
    @Entity
    @EntityListeners(AuditingEntityListener.class)
    public class MyEntity {
    }
    

    가 져 오기@LastModifiedBy대상
    사용 가능@EntityListeners(AuditingEntityListener.class).spring data jpa 는 또 하나의 방식 을 제공 했다.
    class UserRepositoryImpl implements UserRepositoryCustom {
      private final EntityManager em;
      @Autowired
      public UserRepositoryImpl(JpaContext context) {
        this.em = context.getEntityManagerByManagedType(User.class);
      }
    }
    

    https://docs.spring.io/spring-data/jpa/docs/1.11.9.RELEASE/reference/html/#appendix
    작성 자:9527 화 안 링크:https://www.jianshu.com/p/aebc011fcb7d 출처:간 서 간 서 저작권 은 작가 의 소유 이 며,어떠한 형식의 전재 도 작가 에 게 연락 하여 권한 을 수 여 받 고 출처 를 밝 혀 주 십시오.

    좋은 웹페이지 즐겨찾기