Java Spring数据JPA规范中允许三表联接中的空集
我在Spring数据JPAJava Spring数据JPA规范中允许三表联接中的空集,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我在Spring数据JPA规范中加入了三个表,例如: public static Specification<Contact> findByStructureCode(final String code) { return new Specification<Contact>() { @Override public Predicate toPredicate(Root<Contact> root, CriteriaQu
规范中加入了三个表,例如:
public static Specification<Contact> findByStructureCode(final String code) {
return new Specification<Contact>() {
@Override
public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.equal(root.join(Contact_.contactToStructures)
.join(ContactToStructure_.structureCodes)
.get(StructureCode_.code), code);
}
};
}
注意,我已经用假信息替换了最后一行中的包和jar信息。我的代码中堆栈跟踪引用的行是.join(ContactToStructure\uu.structureCodes)
我认为这是因为并非所有的Contact
行在我的数据库中都有相应的ContactToStructure
行
那么,如何进行第一次连接,以允许具有空contactToStructures
集的contactToStructures
实体,并仅返回具有非空contactToStructures
集的contacts
以下是实体及其元模型的相关部分
Contact.java
@Entity
@Table(name = "CONTACT", schema = "myschema")
public class Contact {
@OneToMany(mappedBy = "contact", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private Set<ContactToStructure> contactToStructures = new HashSet<>(0);
}
@StaticMetamodel(Contact.class)
public class Contact_ {
public static volatile SetAttribute<Contact, ContactToStructure> contactToStructures;
}
@Entity
@Table(name = "CONTACT_TO_STRUCTURE", schema = "myschema")
public class ContactToStructure {
@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL}, mappedBy="contactToStructure")
private Collection<StructureCode> structureCodes = new ArrayList<>();
}
@StaticMetamodel(ContactToStructure.class)
public class ContactToStructure_ {
public static volatile SetAttribute<ContactToStructure, StructureCode> structureCodes;
}
@Entity
@Table(name = "STRUCTURE_CODE", schema = "myschema")
public class StructureCode {
@Column(name = "CODE")
private String code;
}
@StaticMetamodel(StructureCode.class)
public class StructureCode_ {
public static volatile SingularAttribute<StructureCode, String> code;
}
StructureCode_uu2;.java
@Entity
@Table(name = "CONTACT", schema = "myschema")
public class Contact {
@OneToMany(mappedBy = "contact", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private Set<ContactToStructure> contactToStructures = new HashSet<>(0);
}
@StaticMetamodel(Contact.class)
public class Contact_ {
public static volatile SetAttribute<Contact, ContactToStructure> contactToStructures;
}
@Entity
@Table(name = "CONTACT_TO_STRUCTURE", schema = "myschema")
public class ContactToStructure {
@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL}, mappedBy="contactToStructure")
private Collection<StructureCode> structureCodes = new ArrayList<>();
}
@StaticMetamodel(ContactToStructure.class)
public class ContactToStructure_ {
public static volatile SetAttribute<ContactToStructure, StructureCode> structureCodes;
}
@Entity
@Table(name = "STRUCTURE_CODE", schema = "myschema")
public class StructureCode {
@Column(name = "CODE")
private String code;
}
@StaticMetamodel(StructureCode.class)
public class StructureCode_ {
public static volatile SingularAttribute<StructureCode, String> code;
}
@StaticMetamodel(StructureCode.class)
公共类结构代码{
公共静态属性码;
}
如果仍然相关
尝试进行以下更改ContactToStructure\uuz.java
:
public static volatile SetAttribute<Version, UseCase> useCases;
publicstaticvolatilesetattribute用例;
致:
公共静态volatile CollectionAttribute用例;
如果仍然相关
尝试进行以下更改ContactToStructure\uuz.java
:
public static volatile SetAttribute<Version, UseCase> useCases;
publicstaticvolatilesetattribute用例;
致:
公共静态volatile CollectionAttribute用例;
这不是你所担心的(事实上,你正在构建的查询应该会产生你想要的行为)。在将任何查询发送到数据库之前很久就会引发异常。我相信您遇到了这个问题:不,我的元模型和它们对应的实体都在同一个包中,并且名称完全相同,只是元模型类名和文件名的末尾有一个下划线。这不是您所担心的(事实上,您正在构建的查询应该会产生您想要的行为). 在将任何查询发送到数据库之前很久就会引发异常。我认为您遇到了这个问题:不,我的元模型与它们对应的实体都在同一个包中,并且名称完全相同,除了元模型类名和文件名末尾包含下划线之外。