Skip to content

Commit eb86424

Browse files
authored
BAEL-8113: How to fix JPA NoResultException: No entity found for query (#18981)
* BAEL-8113: How to fix JPA NoResultException: No entity found for query * BAEL-8113: How to fix JPA NoResultException: No entity found for query * BAEL-8113: fix indentation
1 parent 44095b5 commit eb86424

File tree

5 files changed

+169
-0
lines changed

5 files changed

+169
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.baeldung.exception;
2+
3+
public class UserNotFoundException extends RuntimeException {
4+
5+
public UserNotFoundException(String message) {
6+
super(message);
7+
}
8+
9+
public UserNotFoundException(String message, Throwable cause) {
10+
super(message, cause);
11+
}
12+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.exception.entity;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.GeneratedValue;
5+
import jakarta.persistence.GenerationType;
6+
import jakarta.persistence.Id;
7+
8+
@Entity
9+
public class User {
10+
11+
@Id
12+
@GeneratedValue(strategy = GenerationType.IDENTITY)
13+
private Long id;
14+
15+
private String username;
16+
private String email;
17+
18+
public User() {}
19+
20+
public User(String username, String email) {
21+
this.username = username;
22+
this.email = email;
23+
}
24+
25+
public Long getId() {
26+
return id;
27+
}
28+
29+
public String getUsername() {
30+
return username;
31+
}
32+
33+
public String getEmail() {
34+
return email;
35+
}
36+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.baeldung.exception.repository;
2+
3+
import com.baeldung.exception.entity.User;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
import java.util.Optional;
7+
8+
public interface UserRepository extends JpaRepository<User, Long> {
9+
10+
Optional<User> findByUsername(String username);
11+
12+
Optional<User> findByEmail(String email);
13+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.baeldung.exception.service;
2+
3+
import com.baeldung.exception.UserNotFoundException;
4+
import com.baeldung.exception.entity.User;
5+
import com.baeldung.exception.repository.UserRepository;
6+
import org.springframework.stereotype.Service;
7+
8+
import java.util.List;
9+
import java.util.Optional;
10+
11+
@Service
12+
public class UserService {
13+
14+
private final UserRepository userRepository;
15+
16+
public UserService(UserRepository userRepository) {
17+
this.userRepository = userRepository;
18+
}
19+
20+
// Optional-based API
21+
public Optional<User> findUserByUsername(String username) {
22+
return userRepository.findByUsername(username);
23+
}
24+
25+
public Optional<User> findUserByEmail(String email) {
26+
return userRepository.findByEmail(email);
27+
}
28+
29+
// Business-level exception handling
30+
public User findUserByUsernameOrThrow(String username) {
31+
return userRepository.findByUsername(username)
32+
.orElseThrow(() ->
33+
new UserNotFoundException("User not found: " + username));
34+
}
35+
36+
public User findUserByEmailOrThrow(String email) {
37+
return userRepository.findByEmail(email)
38+
.orElseThrow(() ->
39+
new UserNotFoundException("User not found: " + email));
40+
}
41+
42+
public List<User> getAllUsers() {
43+
return userRepository.findAll();
44+
}
45+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.baeldung.exception;
2+
3+
import com.baeldung.exception.entity.User;
4+
import com.baeldung.exception.repository.UserRepository;
5+
import com.baeldung.exception.service.UserService;
6+
import org.junit.jupiter.api.Test;
7+
8+
import java.util.Optional;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertThrows;
12+
import static org.mockito.Mockito.mock;
13+
import static org.mockito.Mockito.when;
14+
15+
class UserServiceUnitTest {
16+
17+
private final UserRepository userRepository = mock(UserRepository.class);
18+
private final UserService userService = new UserService(userRepository);
19+
20+
@Test
21+
void givenExistingUsername_whenFindUserByUsernameOrThrow_thenReturnUser() {
22+
User user = new User("john", "[email protected]");
23+
when(userRepository.findByUsername("john"))
24+
.thenReturn(Optional.of(user));
25+
26+
User result = userService.findUserByUsernameOrThrow("john");
27+
28+
assertEquals("john", result.getUsername());
29+
}
30+
31+
@Test
32+
void givenUnknownUsername_whenFindUserByUsernameOrThrow_thenThrowUserNotFoundException() {
33+
when(userRepository.findByUsername("ghost"))
34+
.thenReturn(Optional.empty());
35+
36+
assertThrows(
37+
UserNotFoundException.class,
38+
() -> userService.findUserByUsernameOrThrow("ghost")
39+
);
40+
}
41+
42+
@Test
43+
void givenExistingEmail_whenFindUserByEmailOrThrow_thenReturnUser() {
44+
User user = new User("anna", "[email protected]");
45+
when(userRepository.findByEmail("[email protected]"))
46+
.thenReturn(Optional.of(user));
47+
48+
User result = userService.findUserByEmailOrThrow("[email protected]");
49+
50+
assertEquals("[email protected]", result.getEmail());
51+
}
52+
53+
@Test
54+
void givenUnknownEmail_whenFindUserByEmailOrThrow_thenThrowUserNotFoundException() {
55+
when(userRepository.findByEmail("[email protected]"))
56+
.thenReturn(Optional.empty());
57+
58+
assertThrows(
59+
UserNotFoundException.class,
60+
() -> userService.findUserByEmailOrThrow("[email protected]")
61+
);
62+
}
63+
}

0 commit comments

Comments
 (0)