Java JPA标准似乎忽略了连接条件
我的应用程序中有一个用户和联系人实体,我需要确保每个用户都可以添加有关每个联系人的私人评论,并且该评论必须仅对该用户可用。所以我创建了一个新实体-PrivateInfo。这是密码 用户类别: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
@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));