java - Spring Data JPA 规范中三表连接中允许空集

标签 java spring hibernate jpa spring-data-jpa

我正在 Spring Data JPA 规范 中连接三个表,如下所示:

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);
        }
    };
}

但是,这给了我一个很好的旧NullPointerException

java.lang.NullPointerException: null
    at org.hibernate.jpa.criteria.path.AbstractFromImpl.constructJoin(AbstractFromImpl.java:345) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.jpa.criteria.path.AbstractFromImpl.join(AbstractFromImpl.java:333) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.jpa.criteria.path.AbstractFromImpl.join(AbstractFromImpl.java:324) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final]
    at my.package.ContactSpecification$3.toPredicate(ContactSpecification.java:83) ~[MyProject-1.0.0.jar:na]

请注意,我已用虚假信息替换了最后一行中的包和 jar 信息。我的代码中堆栈跟踪引用的行是 .join(ContactToStructure_.structureCodes)

我认为这是由于数据库中并非所有 Contact 行都有对应的 ContactToStructure 行造成的。

那么,如何进行第一次连接以允许具有空 contactToStructures 集的 Contact 实体,并仅返回具有非空 contactToStructures 集的联系人?

<小时/>

以下是实体及其元模型的相关部分。

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);    
}

Contact_.java

@StaticMetamodel(Contact.class)
public class Contact_ {
    public static volatile SetAttribute<Contact, ContactToStructure> contactToStructures;
}

ContactToStructure.java

@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<>();
}

ContactToStructure_.java

@StaticMetamodel(ContactToStructure.class)
public class ContactToStructure_ {
    public static volatile SetAttribute<ContactToStructure, StructureCode> structureCodes;
}

StructureCode.java

@Entity
@Table(name = "STRUCTURE_CODE", schema = "myschema")
public class StructureCode {
    @Column(name = "CODE")
    private String code;
}

StructureCode_.java

@StaticMetamodel(StructureCode.class)
public class StructureCode_ {
    public static volatile SingularAttribute<StructureCode, String> code;
}

最佳答案

如果仍然相关 尝试进行以下更改ContactToStructure_.java:

public static volatile SetAttribute<Version, UseCase> useCases;

致:

public static volatile CollectionAttribute<Version, UseCase> useCases;

关于java - Spring Data JPA 规范中三表连接中允许空集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33902780/

相关文章:

java - 对变量的设置使用react

java - 有史以来第一个 Java 程序错误的输出

java - 如何解压缩 Flux<DataBuffer> (以及如何编写)?

java - Spring JDBC 支持和大型数据集

java - JPA JBoss 事务未提交

java - 使用 JPA/Hibernate 最小化 JSON 以反序列化和持久化复杂的 POJO

java - 俄罗斯方 block 旋转算法不起作用

java - 让 Swagger 提供用户和密码以对我的 Tomcat 应用程序进行身份验证

java - Android textField 填充父级的剩余高度

java - spring SQL Injection中的@Query注解安全吗?