2015-11-27 36 views
5

Tôi đang phát triển một ứng dụng bằng cách sử dụng Spring Boot bằng JPA. Trong ứng dụng tôi đang hiển thị API còn lại. Tôi không muốn sử dụng phần còn lại của dữ liệu Spring vì tôi muốn có toàn quyền kiểm soát dữ liệu.Cách lấy EntityGraph động trong Spring Boot

Tôi không thể tìm ra cách sử dụng EntityGraph động.

Giả sử mô hình tôi đã sau lấy từ here

@Entity 
class Product { 

    @ManyToMany 
    Set<Tag> tags; 

    // other properties omitted 
} 

interface ProductRepository extends Repository<Customer, Long> { 

    @EntityGraph(attributePaths = {"tags"}) 
    Product findOneById(Long id); 
} 

Tôi đã theo liên kết còn lại để truy cập sản phẩm http://localhost:8090/product/1

Nó trả về cho tôi sản phẩm với id 1

Câu hỏi:

  1. Nó sẽ bằng defaul t tìm nạp thẻ như chúng tôi đã đề cập @EntityGraph? Nếu có thì điều này có thể được cấu hình theo yêu cầu không? Giả sử, nếu trong truy vấn chuỗi Tôi có bao gồm = thẻ, thì chỉ tôi muốn tìm nạp sản phẩm với thẻ của nó.

Tôi đã tìm thấy this bài viết nhưng không chắc chắn điều này có thể hữu ích như thế nào.

Trả lời

6

Định nghĩa của EntityGraph trong Kho dữ liệu JPA Spring là tĩnh. Nếu bạn muốn có nó năng động, bạn cần phải làm điều này programatically như trong trang mà bạn liên quan đến:

EntityGraph<Product> graph = this.em.createEntityGraph(Product.class); 
graph.addAttributeNodes("tags"); //here you can add or not the tags 

Map<String, Object> hints = new HashMap<String, Object>(); 
hints.put("javax.persistence.loadgraph", graph); 

this.em.find(Product.class, orderId, hints); 

Ngoài ra bạn có thể xác định các phương pháp với EntityGraph trong JPA Repository của bạn.

interface ProductRepository extends Repository<Product, Long> { 

@EntityGraph(attributePaths = {"tags"}) 
@Query("SELECT p FROM Product p WHERE p.id=:id") 
Product findOneByIdWithEntityGraphTags(@Param("id") Long id); 
} 

Và sau đó có một phương pháp trong dịch vụ của bạn trong đó sử dụng phương pháp này với EntityGraph hoặc được xây dựng trong findOne(T id) mà không EntityGraph:

Product findOneById(Long id, boolean withTags){ 
    if(withTags){ 
    return productRepository.findOneByIdWithEntityGraphTags(id); 
    } else { 
    return productRepository.findOne(id); 
    } 
} 
Các vấn đề liên quan