學習Spring-Data-Jpa(九)---注解式方法查詢之@NamedQuery、@NamedNativeQuery


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM