Java JPA标准似乎忽略了连接条件

Java JPA标准似乎忽略了连接条件,java,hibernate,jpa,spring-data,criteria,Java,Hibernate,Jpa,Spring Data,Criteria,我的应用程序中有一个用户和联系人实体,我需要确保每个用户都可以添加有关每个联系人的私人评论,并且该评论必须仅对该用户可用。所以我创建了一个新实体-PrivateInfo。这是密码 用户类别: @Entity @Table(name = "users") @XmlAccessorType(XmlAccessType.FIELD) public class User implements Serializable { @Id @GeneratedValue(strategy = Generatio

我的应用程序中有一个用户联系人实体,我需要确保每个用户都可以添加有关每个联系人的私人评论,并且该评论必须仅对该用户可用。所以我创建了一个新实体-PrivateInfo。这是密码

用户类别:

@Entity
@Table(name = "users")
@XmlAccessorType(XmlAccessType.FIELD)
public class User implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String login;

// other fields
}
联络类别:

@Entity
@Table(name = "contacts")
@XmlAccessorType(XmlAccessType.FIELD)
public class Contact implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;

@OneToMany(fetch = LAZY, cascade = ALL, mappedBy = "contact")
private Set<PrivateInfo> privateInfo;

// etc.
}
我将Spring数据存储库与JpaSpecificationExecutor一起用于查询,因此我尝试编写规范,用于获取特定用户的所有私人信息联系人

public static Specification<Contact> withPrivateInfo(final long userId) {
    return new Specification<Contact>() {

        @Override
        public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            Join<Contact, PrivateInfo> joinPrivateInfo = root.join(Contact_.privateInfo, JoinType.LEFT);
            joinPrivateInfo.on(cb.equal(
                  joinPrivateInfo.get(PrivateInfo_.pk).get(PrivateInfoKey_.userId), userId
            ));

            return cb.conjunction();   // translates in sql like '... where 1 = 1'
        }
    };
}
我正在接收联系人,每个联系人都在privateInfo字段中包含有关此联系人的所有用户信息(不只是id=1的用户,如预期)。似乎忽略了条件上的连接

如何实现我的目标有什么建议吗?可能是另一个实体结构。这在JPA/标准中是否可行

public static Specification<Contact> withPrivateInfo(final long userId) {
    return new Specification<Contact>() {

        @Override
        public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            Join<Contact, PrivateInfo> joinPrivateInfo = root.join(Contact_.privateInfo, JoinType.LEFT);
            joinPrivateInfo.on(cb.equal(
                  joinPrivateInfo.get(PrivateInfo_.pk).get(PrivateInfoKey_.userId), userId
            ));

            return cb.conjunction();   // translates in sql like '... where 1 = 1'
        }
    };
}
 contactRepository.findAll(withPrivateInfo(1));