雖然Spring Data JPA提供了多種自動生成查詢的功能,但在某些情況下,我們需要更加複雜的查詢邏輯。這就是自定義查詢的用武之地。使用自定義查詢可以讓我們充分發揮SQL的強大功能
首先我們創建一個簡單的實體。假設我們有一個User實體,代表使用者的基本信息
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getters and setters
}
接著我們需要創建一個repository介面,這個介面將繼承JpaRepository,並添加自定義查詢的方法
public interface UserRepository extends JpaRepository<User, Long> {
// 基於方法名的查詢
List<User> findByName(String name);
// 自定義SQL查詢
@Query("SELECT u FROM User u WHERE u.email = :email")
User findUserByEmail(@Param("email") String email);
}
在上面的程式碼中,我們定義了一個方法findUserByEmail,這是一個自定義的JPQL查詢,你可以使用類似的方式來實現SQL原生查詢
如果你想使用原生SQL查詢,可以使用nativeQuery = true的屬性
@Query(value = "SELECT * FROM users WHERE email = :email", nativeQuery = true)
User findUserByEmailNative(@Param("email") String email);
再來創建一個UserService來使用這個repository
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserByEmail(String email) {
return userRepository.findUserByEmail(email);
}
public List<User> getUsersByName(String name) {
return userRepository.findByName(name);
}
}
最後,我們可以在控制器中測試這些查詢
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/email/{email}")
public User getUserByEmail(@PathVariable String email) {
return userService.getUserByEmail(email);
}
@GetMapping("/name/{name}")
public List<User> getUsersByName(@PathVariable String name) {
return userService.getUsersByName(name);
}
}
透過簡單的實體、repository、service和controller層,我們可以輕鬆實現對資料庫的CRUD操作