2015-01-12 14 views
6

Chúng tôi có một đối tượng Media:quyến rũ Háo hức trong một Specification Xuân

public class Media implements Serializable { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(insertable = false, updatable = false) 
    private Long id; 
    // other attributes 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "channelId", referencedColumnName = "id") 
    private Channel channel; 
    // getters, setters, hashCode, equals, etc. 

}

Các háo hức lấy của cha mẹ kênh làm việc trong các phương pháp kho thường xuyên, nhưng không phải khi sử dụng một số kỹ thuật.

Đây là Quy cách:

public class MediaSpecs { 

public static Specification<Media> search(final Long partnerId, final Integer width, final Integer height, 
     final String channelType) { 

    return new Specification<Media>() { 

     @Override 
     public Predicate toPredicate(Root<Media> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
      Predicate restrictions = cb.equal(root.get("archived"), false); 
      // other restrictions are and-ed together 
      if (channelType != null) { 
        Join<Media, ChannelType> join = root.join("channel").join("orgChannelType").join("type"); 
       restrictions = cb.and(cb.equal(join.get("type"), channelType)); 
      } 
      return restrictions; 
     } 
    }; 
} 

Các "tìm kiếm" spec hoạt động chính xác khi channelType được quy định, do đó tham gia đang làm việc. Làm cách nào để xác định rằng các kết nối sẽ được tải xuống háo hức?

Tôi đã thử thêm

Fetch<Media, ChannelType> fetch = root.fetch("channel").fetch("orgChannelType").fetch("type"); 

Sau đó Hibernate ném một ngoại lệ:

org.hibernate.QueryException: truy vấn định tham gia quyến rũ, nhưng chủ sở hữu của hiệp hội lấy đã không có mặt trong danh sách lựa chọn [ FromElement {rõ ràng, không phải là một tập hợp tham gia, tìm nạp tham gia, tìm nạp thuộc tính không phải là lười, classAlias ​​= generatedAlias4 ...

Làm cách nào để thêm các liên kết vào danh sách lựa chọn?

Cảm ơn.

Trả lời

6

Tôi nghĩ bạn gặp sự cố với truy vấn tính. Thông thường, đặc điểm kỹ thuật được sử dụng cho truy vấn dữ liệu và truy vấn đếm. Và đối với truy vấn đếm không có "Phương tiện". Tôi sử dụng workaround này:

Class<?> clazz = query.getResultType(); 
if (clazz.equals(Media.class)) { 
    root.fetch("channel"); 
} 

sử dụng này lấy chỉ cho dữ liệu truy vấn một không cho đếm truy vấn.

0

Ví dụ:

public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
       if (Long.class != query.getResultType()) { 
        root.fetch(Person_.addresses); 
       } 
       return cb.conjunction(); 
      } 
+0

pl giải thích câu trả lời của bạn –

+0

tôi kiểm tra nếu điều này là một truy vấn count (kết quả Long.class) sau đó tôi chỉ cần bỏ qua Truy xuất tham gia – Eugene

Các vấn đề liên quan