JPA中的查询语句可以使用哪些方式进行定义和执行?

JPA中的查询语句可以通过以下方式进行定义和执行:

  1. JPQL查询:通过Java Persistence Query Language定义查询。在EntityManager上使用createQuery()执行。
TypedQuery<User> query = em.createQuery("SELECT u FROM User u", User.class);  
List<User> users = query.getResultList();
  1. 本地SQL查询:在实体类上使用@NamedNativeQuery注解定义本地SQL查询。使用createNativeQuery()执行。
@NamedNativeQuery(name = "User.findBySQL", 
                  query = "SELECT * FROM USER WHERE agE>?" , 
                  resultClass = User.class)
public class User { ... }  

Query query = em.createNativeQuery("User.findBySQL", User.class);  
query.setParameter(1, 10);    
List<User> users = query.getResultList(); 
  1. 存储过程:使用@NamedStoredProcedureQuery注解在实体上定义存储过程。使用createNamedStoredProcedureQuery()执行。
@NamedStoredProcedureQuery(
   name="User.delete",
   procedureName="delete_user_sp",
   parameters = {
       @StoredProcedureParameter(name = "username", queryParameter = "name")   
   }   
) 
public class User { ... } 

StoredProcedureQuery query =  
   em.createNamedStoredProcedureQuery("User.delete");  
query.setParameter("name", "John");
query.execute();
  1. 轻量级查询:直接在EntityManager上使用createQuery()或createNativeQuery()构建并立即执行查询。
List<User> users = em.createQuery("SELECT u FROM User u")  
                      .setParameter(1, 10)  
                      .getResultList();