๐ค ์ค์ ๋ก ์๋น์ค์์๋ WHERE ์กฐ๊ฑด์ด ๋ณต์กํ ํ ๋ฐ...์ด๋ปํ์ง?
QueryMethod ํ์ฉ
JPA ์ฌ์ฉํ ๋ QueryMethod๊ฐ ๋ง์ ํดํ์ ๋ฐ๋๋ค. ๋ ํ์งํ ๋ฆฌ์ ๋ค์ด๋ฐ๋ฒ ์ด์ค๋ก ์ ์ธ๋ง ํ๋ฉด Query๋ฅผ ๋ถ๋ฌ์ฌ์์๋ค. ํ์ง๋ง ๋จผ์ QueryMethod๊ฐ ์ด๋ป๊ฒ ๋ง๋ค์ด ์ง๊ณ ์๋ํ๋์ง ์์์ผํ๋ค.
TYPE
โ ๋จผ์ UserRepository์ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name); //์ด๋ฆ์ ํตํด ์ ์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋.
}
โ Test ํด๋ณด์
@Test
void select() {
System.out.println(userRepository.findByName("martin"));
}
๐ ์๋ฌ๊ฐ ๋๋ ๊ฒ์ ๋น์ฐํ๋ค ๊ฒ์ํ martin์ 2๋ช ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
โ ๋ฆฌ์คํธ ํ์ ์ผ๋ก ๋ฐ๊พธ๊ณ ํด๋ณด์.
List<User> findByName(String name); //์ด๋ฆ์ ํตํด ์ ์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋.
โ ์๋์๋ค.
[User(id=1, name=martin, email=martin@fast.com, createdAt=2022-02-04T00:58:41.588, updatedAt=2022-02-04T00:58:41.588),
User(id=5, name=martin, email=james@another.com, createdAt=2022-02-04T00:58:41.603, updatedAt=2022-02-04T00:58:41.603)]
๐คโ ๐๐๐ค๐ฎ
๐ค JpaRepository์์, ์ฆ ์ฟผ๋ฆฌ๋ฉ์๋์์๋ ๋ฆฌํดํ์ ์ ๊ณ ์ ํด์ผํ๋๊ฒ์ด ์๋๋ผ ๋ฆฌํด์ด 1๊ฐ or N๊ฐ์ ๋ฐ๋ผ ์๋์ผ๋ก ๋ฆฌํดํ์ ์์ ์ ๊ณตํด์ค๋ค. ์ด๋ค ํ์ ๋ค์ ์ ๊ณตํ๋์ง ์ดํด๋ณด์.
๐ฎ ํธ๋ฆฌํ๊ฒ ์ ๊ณตํ๋ ์ฅ์ ๋ ์์ง๋ง ๋ฐํ์(์คํ)ํ ๋ ์ค๋ฅ๊ฐ ๋ ์ ์์ผ๋ ์ ํํ๊ฒ ์ง์ ํด์ฃผ๋๊ฒ์ด ์ข๋ค.
๐ค NAMEING ํจ์ ์ด๋ฆ์ ์ด๋ป๊ฒ ์ง์๊น?
JPA์์๋ ๊ฐ๋ ์ฑ ์๋ ํ๋ก๊ทธ๋๋ฐ์ ์งํฅํด ์ด๋ค์ด๋ฆ์ผ๋ก ํด๋ ํจ์๋ฅผ ์ง์ ํด๋๋๋ค.
๐ ํ์ง๋ง ์ํฐํฐ์ ํ์
์ด ๋ช
์๋์ด ์์ผ๋ฉด findUserByName getUsersByID ๊ฐ์ ์ ๋์ฌ ์์ User๋ผ๋ ๋ช
์๋ ํ์์๋ค.
๐ ๋ํ findByByName ์ด๋ผ๊ณ ์ณ๋ Test๋ ํต๊ณผํ์ง๋ง ์คํ์ค์ ์ค๋ฅ๊ฐ ๋์ค๋ ์ ๋งํ๋ฉด ๋ฉ์๋ ์ด๋ฆ์ ์์ ์ฌ์ง๋๋ก ํ๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋ฆฌ๊ณ ๊ผญ Test ํด๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
โ select๋ฌธ ํ๋ฒ ๋ง๋ค์ด๋ณด์.
User findByEmail(String email);
User getByEmail(String email);
User readByEmail(String email);
User queryByEmail(String email);
User searchByEmail(String email);
User streamByEmail(String email);
User findUserByEmail(String email); // ๋น์ถ. User๋ ์ด๋ฏธ ๋ช
์๋์ด์๋ค.
User findSomethingByEmail(String email); // ์ด๋ ๊ฒ ํด๋ ๋์ง๋ง, ๋น์ถ. ๋ช
์์ ์ผ๋ก ํ์
@Test
void select() {
System.out.println(userRepository.findByName("martin"));
System.out.println("findByEmail : " + userRepository.findByEmail("martin@fast.com"));
System.out.println("getByEmail : " + userRepository.getByEmail("martin@fast.com"));
System.out.println("readByEmail : " + userRepository.readByEmail("martin@fast.com"));
System.out.println("queryByEmail : " + userRepository.queryByEmail("martin@fast.com"));
System.out.println("searchByEmail : " + userRepository.searchByEmail("martin@fast.com"));
System.out.println("streamByEmail : " + userRepository.streamByEmail("martin@fast.com"));
System.out.println("findUserByEmail : " + userRepository.findUserByEmail("martin@fast.com"));
System.out.println("findSomethingByEmail : " + userRepository.findSomethingByEmail("martin@fast.com"));
}
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํจ์์ด๋ฆ์ ๋ฌ๋ผ๋ ์ฟผ๋ฆฌ๊ฐ ๊ฐ๋ค.
โ
์กฐ๊ธ ๋ ์ค์ตํด ๋ณด์. First,Top์ ์ฌ์ฉํด๋ณด์. ๊ทธ๋ฆฌ๊ณ Last๋ ํ๋ฒ ์คํํด๋ณด์.
UserRepository
List<User> findFirst2ByName(String name);
List<User> findTop2ByName(String name);
List<User> findLast1ByName(String name);
UserRepositoryTest
System.out.println("findTop2ByName : " + userRepository.findTop2ByName("martin"));
System.out.println("findFirst2ByName : " + userRepository.findFirst2ByName("martin"));
System.out.println("findLast1ByName : " + userRepository.findLast1ByName("martin"));
๐ martin์ ์กฐ๊ฑด์ผ๋ก Limit๋ฅผ ๊ฑธ์ด์ 2๋ช ์ ์ถ๋ ฅํ๋ค. ๊ตฟ๊ตฟ!!
๐ค ํ์ง๋ง findLast1ByName์ ์ ์์ ์ผ๋ก ์๋ํ์๊น?
๐ Test๋ ํต๊ณผํ์์ง๋ง ์ ์ ์๋์ ์๋๋ค. Last ๋ผ๋ Keyword๋ JPA์์ ๊ฐ์งํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ผ๋ฐ select์ฟผ๋ฆฌ๋ฅผ ๋ฑ์ด๋๋ค.
๐ค ์ฐธ๊ณ ์ฌํญ์ผ๋ก... Last๋ฅผ ๋ฝ์ผ๋ ค๋ฉด OrderBy๋ฅผ ์ฌ์ฉํ์ฌ ์ญ์์ ๋ ฌํ๊ณ first1์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๐ค Where ์กฐ๊ฑด๋ค์ด ๊ฐ๋จํ์ง ์์ํ ๋ฐ....
๊ทธ๋์ ์๋ ์ฌ์ง์ ํค์๋๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
โ ์ค์ตํด๋ณด์
๐ findByEmailAndName
// AND
List<User> findByEmailAndName(String email, String name);
// OR
List<User> findByEmailOrName(String email, String name);
// After('>',~๋ณด๋ค ํฐ๊ฒ), Before('<',~๋ณด๋ค ์์ ๊ฒ)
List<User> findByCreatedAtAfter(LocalDateTime yesterday);
List<User> findByIdAfter(Long id);
// GreaterThan == (After Before์ ๊ฐ์ง๋ง, ์ข ๋ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ ๋ชจ๋ ์ซ์ ๊ฐ ๋ ์ง ๊ฐ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.)
List<User> findByCreatedAtGreaterThan(LocalDateTime yesterday);
// GreaterThanEqual('์ด์','>=') (์ฐธ๊ณ ๋ก Before,After๋ ์ด๊ณผ,๋ฏธ๋ง ๋ง ๊ฐ๋ฅํ๋ค.)
List<User> findByCreatedAtGreaterThanEqual(LocalDateTime yesterday);
// Between (~์ ~์ฌ์ด) (์๋์ ๊ฐ์ ํฌํจํ๋ค!!!!)
List<User> findByCreatedAtBetween(LocalDateTime yesterday, LocalDateTime tomorrow);
List<User> findByIdBetween(Long id1, Long id2);
// (Between์ ํ์ด์ ์ด ๊ฒ) GreaterThanEqual And LessThanEqual (~์ด์ ๊ทธ๋ฆฌ๊ณ ~์ดํ)
List<User> findByIdGreaterThanEqualAndIdLessThanEqual(Long id1, Long id2);
// IsNotNull (๋น ๊ฐ์ด ์๋ ๊ฒ ์ฐพ๊ธฐ) (IsNull์ ๋น ๊ฐ ์ฐพ๊ธฐ)
List<User> findByIdIsNotNull();
// In ('๋ฌธ์'๋ฅผ ๊ฐ์ง๊ณ ์๋ ์คํค๋ง ์ฐพ๊ธฐ) (or์กฐ๊ฑด๊ณผ ๋น์ทํ๋ค)
List<User> findByNameIn(List<String> names);
// StartingWith ('?' ์ผ๋ก ์์ํ๋ ๋ฌธ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์คํค๋ง ์ฐพ๊ธฐ)
List<User> findByNameStartingWith(String name);
// EndingWith ('?' ์ผ๋ก ๋๋๋ ๋ฌธ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์คํค๋ง ์ฐพ๊ธฐ)
List<User> findByNameEndingWith(String name);
// Contains ('?' ๊ธ์๋ฅผ ํฌํจํ๋ ๋ฌธ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์คํค๋ง ์ฐพ๊ธฐ)
List<User> findByNameContains(String name);
// Like ( ์ 3๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ณตํฉ์ ์ผ๋ก ์ฌ์ฉ , %A [A๋ก ๋] , A% [A๋ก ์์] , %A% [Aํฌํจ]
List<User> findByNameLike(String name);
// Is ,Equals (ํ๋ผ๋ฏธํฐ์ ์ผ์นํ๋ ์ฟผ๋ฆฌ)(์ฝ๋ ๊ฐ๋
์ฑ์ ๋ํ์ค๋ค.)
Set<User> findUserByNameIs(String name);
Set<User> findUserByNameEquals(String name);
System.out.println("findByEmailAndName : " + userRepository.findByEmailAndName("martin@fast.com", "martin"));
System.out.println("findByEmailOrName : " + userRepository.findByEmailOrName("martin@fast.com", "dennis"));
System.out.println("findByCreatedAtAfter : " + userRepository.findByCreatedAtAfter(LocalDateTime.now().minusDays(1L)));
System.out.println("findByIdAfter : " + userRepository.findByIdAfter(4L));
System.out.println("findByCreatedAtGreaterThan : " + userRepository.findByCreatedAtGreaterThan(LocalDateTime.now().minusDays(1L)));
System.out.println("findByCreatedAtGreaterThanEqual : " + userRepository.findByCreatedAtGreaterThanEqual(LocalDateTime.now().minusDays(1L)));
System.out.println("findByCreatedAtBetween : " + userRepository.findByCreatedAtBetween(LocalDateTime.now().minusDays(1L), LocalDateTime.now().plusDays(1L)));
System.out.println("findByIdBetween : " + userRepository.findByIdBetween(1L, 3L));
System.out.println("findByIdGreaterThanEqualAndIdLessThanEqual : " + userRepository.findByIdGreaterThanEqualAndIdLessThanEqual(1L, 3L));
System.out.println("findByIdIsNotNull : " + userRepository.findByIdIsNotNull());
System.out.println("findByNameIn : " + userRepository.findByNameIn(Lists.newArrayList("martin", "dennis")));
System.out.println("findByNameStartingWith : " + userRepository.findByNameStartingWith("mar"));
System.out.println("findByNameEndingWith : " + userRepository.findByNameEndingWith("tin"));
System.out.println("findByNameContains : " + userRepository.findByNameContains("art"));
System.out.println("findByNameLike : " + userRepository.findByNameLike("%" + "art" + "%"));
'Dev > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA Entity์ ๊ธฐ๋ณธ์์ฑ (0) | 2022.03.02 |
---|---|
JPA ์ฟผ๋ฆฌ๋ฉ์๋ ์ ๋ ฌ (0) | 2022.03.02 |
JPA Repository Interface ์์ธ 2 (0) | 2022.03.02 |
JPA Repository Interface ์์ธ 1 (0) | 2022.03.02 |
์์์ฑ ์ปจํ ์คํธ (0) | 2022.03.02 |