संपादित करें:ठीक है, मैंने यहां काफी गड़बड़ी की है, लेकिन मुझे आशा है कि इस बार मैं सही उत्तर के करीब हूं।
विचार करें (आईडी जॉन आदि के लिए 1 की तरह स्वतः उत्पन्न होते हैं):
INSERT INTO some_user (name) VALUES ('John');
INSERT INTO some_user (name) VALUES ('Ariel');
INSERT INTO some_user (name) VALUES ('Brian');
INSERT INTO some_user (name) VALUES ('Kelly');
INSERT INTO some_user (name) VALUES ('Tom');
INSERT INTO some_user (name) VALUES ('Sonya');
INSERT INTO product (owner_id,name) VALUES (1,'Nokia 3310');
INSERT INTO product (owner_id,name) VALUES (2,'Sony Xperia Aqua');
INSERT INTO product (owner_id,name) VALUES (3,'IPhone 4S');
INSERT INTO product (owner_id,name) VALUES (1,'Xiaomi MI5');
INSERT INTO product (owner_id,name) VALUES (3,'Samsung Galaxy S7');
INSERT INTO product (owner_id,name) VALUES (3,'Sony Xperia Z3');
INSERT INTO following_relationship (follower_id, owner_id) VALUES (4,1);
INSERT INTO following_relationship (follower_id, owner_id) VALUES (5,1);
INSERT INTO following_relationship (follower_id, owner_id) VALUES (4,2);
INSERT INTO following_relationship (follower_id, owner_id) VALUES (6,2);
INSERT INTO following_relationship (follower_id, owner_id) VALUES (6,3);
INSERT INTO following_relationship (follower_id, owner_id) VALUES (1,3);
आपके द्वारा प्रदान की गई संस्थाओं के सरलीकृत संस्करण के आधार पर, और SomeUser Entity जैसे:
@Entity
public class FollowingRelationship {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name = "owner_id")
SomeUser owner;
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name = "follower_id")
SomeUser follower;
...
@Entity
public class Product {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@ManyToOne()
@JoinColumn(name = "owner_id")
private SomeUser owner;
@Column
private String name;
...
@Entity
public class SomeUser {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@OneToMany(mappedBy = "owner")
private Set<Product> products = new HashSet<Product>();
@OneToMany(mappedBy = "owner")
private Set<FollowingRelationship> ownedRelationships = new HashSet<FollowingRelationship>();
@OneToMany(mappedBy = "follower")
private Set<FollowingRelationship> followedRelationships = new HashSet<FollowingRelationship>();
मैंने विशिष्टता बनाई है जैसे:
public static Specification<Product> joinTest(SomeUser input) {
return new Specification<Product>() {
public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Join<Product,SomeUser> userProd = root.join("owner");
Join<FollowingRelationship,Product> prodRelation = userProd.join("ownedRelationships");
return cb.equal(prodRelation.get("follower"), input);
}
};
}
और अब, हम क्वेरी को इसके साथ निष्पादित कर सकते हैं:
SomeUser someUser = someUserRepository.findOne(Specification.where(ProductSpecifications.userHasName("Kelly")));
List<Product> thatProducts = productRepository.findAll(Specification.where(ProductSpecifications.joinTest(someUser)));
System.out.println(thatProducts.toString());
हमें मिलता है:
[Product [id=1, name=Nokia 3310], Product [id=4, name=Xiaomi MI5], Product [id=2, name=Sony Xperia Aqua]]
और यह मेरी राय में इसके बराबर है:"सभी उपयोगकर्ताओं से सभी उत्पाद प्राप्त करें जो अन्य उपयोगकर्ता अनुसरण करते हैं" - केली द्वारा अनुसरण किए जा रहे सभी उपयोगकर्ताओं के उत्पाद प्राप्त करें।