Spring Data JPA 학습 노트(1)중국어 수첩
13555 단어 JAVA
참고 문서: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
@NamedQuery
방법 명 을 통 해 문장 을 정의 하 다
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();
…
}
@Query
entityName
을 조합 하면 돌아 오 는 대상 은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);
}
target
i 표시 방법 중 몇 번 째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 출처:간 서 간 서 저작권 은 작가 의 소유 이 며,어떠한 형식의 전재 도 작가 에 게 연락 하여 권한 을 수 여 받 고 출처 를 밝 혀 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.