@NamedQuery allows defining reusable JPQL queries inside the entity class.
Example Entity Class
Let's assume we have a Userentity with fields: id, name, email and age.
User.java
import jakarta.persistence.*;
@Entity
@NamedQueries({
// ✅ Find All Users
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u"),
// ✅ Find User by Name
@NamedQuery(name = "User.findByName", query = "SELECT u FROM User u WHERE u.name = :name"),
// ✅ Find Users Older Than Age
@NamedQuery(name = "User.findOlderThan", query = "SELECT u FROM User u WHERE u.age > :age")
})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
private int age;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Table name : user
id
name
email
age
1
John
john@gmail.com
25
2
Mike
mike@gmail.com
35
3
Watson
watson@gmail.com
40
4
Kenny
kenny@gmail.com
45
Create JPA Repositories
UserRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface UserRepository extends JpaRepository {
// ✅ Get All Users (Named Query)
List findAll();
// ✅ Find User by Name (Named Query)
User findByName(@Param("name") String name);
// ✅ Find Users Older Than Age (Named Query)
List findOlderThan(@Param("age") int age);
}
Create Services
UserService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// ✅ Get All Users
public List getAllUsers() {
return userRepository.findAll();
}
// ✅ Get User by Name
public User getUserByName(String name) {
return userRepository.findByName(name);
}
// ✅ Get Users Older Than Age
public List getUsersOlderThan(int age) {
return userRepository.findOlderThan(age);
}
}
Create Controllers
UserController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
// ✅ Get All Users
@GetMapping
public ResponseEntity> getAllUsers() {
return ResponseEntity.ok(userService.getAllUsers());
}
// ✅ Get User by Name
@GetMapping("/{name}")
public ResponseEntity getUserByName(@PathVariable String name) {
return ResponseEntity.ok(userService.getUserByName(name));
}
// ✅ Get Users Older Than Age
@GetMapping("/older/{age}")
public ResponseEntity> getUsersOlderThan(@PathVariable int age) {
return ResponseEntity.ok(userService.getUsersOlderThan(age));
}
}
Testing the REST API with Postman:
Once the application is running, test the endpoints:
Get All Users GET:http://localhost:8080/users
Get User by Name GET:http://localhost:8080/users/{userName}
Get Users Older Than 30 GET:http://localhost:8080/users/older/{age}
Alternative: Named Native Queries (@NamedNativeQuery)
If you need raw SQL, use @NamedNativeQuery instead of @NamedQuery.
Define Named Native Queries
@NamedNativeQueries({
// ✅ Get All Users (Native SQL)
@NamedNativeQuery(name = "User.findAllNative", query = "SELECT * FROM users", resultClass = User.class),
// ✅ Find User by Name (Native SQL)
@NamedNativeQuery(name = "User.findByNameNative", query = "SELECT * FROM users WHERE name = :name", resultClass = User.class)
})
Repository Usage
public interface UserRepository extends JpaRepository {
@Query(name = "User.findAllNative", nativeQuery = true)
List findAllUsersNative();
@Query(name = "User.findByNameNative", nativeQuery = true)
User findByNameNative(@Param("name") String name);
}
We use cookies and similar technologies to enhance your browsing experience, serve personalized content and advertisements, and analyze our traffic.
By clicking "Accept All", you consent to our use of cookies and the processing of your personal data for these purposes.
You can manage your preferences or learn more in our
Privacy Policy and
Cookie Policy.