作者簡介
陳喆,現就職於中科院某研究所擔任副研究員,專注於工業雲平臺、MES系統的設計與研發。
本例使用<named-query/>元素和@NamedQuery註解,對應的查詢需要使用JPA查詢語言定義。也可以使用<named-native-query/>或@NamedNativeQuery。這樣可以使用原生SQL,但這樣會喪失數據庫平臺獨立性。
XML定義命名查詢
使用XML配置,向位於META-INF文件夾下的orm.xml配置文件添加必要的<name-query/>元素。
<named-query name="User.findByLastname">
<query>select u from User u where u.lastname = ?1</query>
</named-query>
基於註解定義命名查詢
基於註解的配置可以免於編輯額外的配置文件,降低維護成本。但需要你在每次聲明新查詢的時候重新編譯實體類。
@Entity
@NamedQuery(name = "User.findByEmailAddress",
query = "select u from User u where u.emailAddress = ?1")
public class User {
}
聲明接口
要使用上面定義的命名查詢,需要定義到UserRepository接口中:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByLastname(String lastname);
User findByEmailAddress(String emailAddress);
}
Spring Data嘗試處理這些方法對命名查詢的調用,以實體類名稱開始,後接方法名,以點作連接符。所以NameQuery定義在實體上,而不是定義在方法上。