1、@NamedQuery、@NamedNativeQuery
@NamedQuery與@NamedNativeQuery都是定義查詢的一種形式,@NamedQuery使用的是JPQL,而@NamedNativeQuery使用的是原生SQL。這兩種不常用,所以簡單介紹一下。
使用方法:
1.1、在實體@Entity下添加@NamedQuery或@NamedNativeQuery定義。
/** * 類別 * @author caofanqi */ @Data @Entity @Builder @Table(name = "jpa_category") @NoArgsConstructor @AllArgsConstructor @NamedQuery(name = "Category.selectByName",query = "SELECT c FROM Category c WHERE c.categoryName = ?1 ") @NamedNativeQuery(name = "Category.selectByNameLike",query = "SELECT * FROM cfq_jpa_category WHERE category_name LIKE ?1 ",resultClass = Category.class) public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String categoryName; /** * 門類和書是一對多的關系 * 由多的一方來維護關聯關系 */ @OneToMany(mappedBy = "category") @OrderBy("bookName DESC") private List<Book> books; }
1.2、在Repository接口中聲明方法
/** * 門類持久層 * @author caofanqi */ public interface CategoryRepository extends JpaRepository<Category,Long> { /** * 使用@NamedQuery進行方法查詢 * @param name 分類名稱 * @return category */ Category selectByName(String name); /** * 使用@NamedNativeQuery進行方法查詢 * @param name 分類名稱 * @return category */ List<Category> selectByNameLike(String name); }
單元測試:
@Transactional @SpringBootTest class CategoryRepositoryTest { @Resource private CategoryRepository categoryRepository; @BeforeEach void setup(){ Category category1 = Category.builder().categoryName("Java").build(); Category category2 = Category.builder().categoryName("數據庫").build(); Category category3 = Category.builder().categoryName("數據結構").build(); ArrayList<Category> categories = Lists.newArrayList(category1, category2, category3); categoryRepository.saveAll(categories); } @Test void selectByName() { Category category = categoryRepository.selectByName("Java"); assertEquals("Java",category.getCategoryName()); } @Test void selectByNameLike(){ List<Category> categoryList = categoryRepository.selectByNameLike("%據%"); assertEquals(2,categoryList.size()); } }
注意:
1.3、@NamedQuery、@NamedNativeQuery注解也可以使用<named-query>、<named-native-query />標簽來替代寫在orm.xml中。
1.4、@NamedNativeQuery還可以與@SqlResultSetMapping(@EntityResult、@ConstructorResult、@ColumnResult、@FieldResult)注解配置使用,指定映射。
1.5、@NamedQueries、@NamedNativeQueries、@SqlResultSetMappings用於裝多個@NamedQuery、@NamedNativeQuery、@SqlResultSetMapping。
1.6、我們一般不推薦使用@NamedQuery、@NamedNativeQuery,而使用下面的@Query注解。
源碼地址:https://github.com/caofanqi/study-spring-data-jpa