JPA中的实体类可以使用哪些注解来定义查询语句?

JPA中的实体类可以使用以下注解来定义查询语句:

  1. @NamedQuery:定义命名查询。通过查询名称在代码中引用查询。
  2. @NamedNativeQuery:定义命名的原生SQL查询。
  3. @Query:在实体类上定义查询。
  4. @NamedStoredProcedureQuery:定义存储过程查询。
  5. @NamedEntityGraph:定义实体图,用于加载关联实体数据。
  6. @Cacheable:定义查询结果缓存配置。

代码示例:

// 命名查询
@Entity  
@NamedQuery(name = "User.findByName", 
            query = "from User u where u.name = ?1")
public class User {
   ...  
} 

// 查询 
@Entity
@Query("from User u where u.email = ?1")
public class User {
   ...  
}

// 存储过程
@Entity 
@NamedStoredProcedureQuery(
   name = "User.delete", 
   procedureName = "delete_user",
   parameters = {
      @StoredProcedureParameter(mode = ParameterMode.IN, name = "id", type = Long.class)  
   }   
)
public class User {
   ...
}

// 实体图  
@Entity
@NamedEntityGraph(name = "User.allProperties", 
    attributeNodes = {
        @NamedAttributeNode("emails"),
        @NamedAttributeNode("address")  
    }
) 
public class User {
   ... 
}