簡體   English   中英

Spring Data Jpa和規范-如何處理ManyToOne和ManyToMany關系?

[英]Spring Data Jpa and Specification - how to work with ManyToOne and ManyToMany relations?

我的項目中有一個簡單的模型。

[UpdatePackage]>-(ManyToOne)-[版本]-<[UseCase]-(ManyToMany)

public class UpdatePackage implements Comparable<UpdatePackage> {

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = COLUMN_ORIG_VERSION, nullable = true)
    private Version origVersion;

// setters and getters
}

@Entity
@Table(name = Version.TABLE_NAME)
public class Version {

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = JVUC_TABLE, joinColumns = { @JoinColumn(name = JVUC_COLUMN_VERSION, referencedColumnName = COLUMN_ID) }, inverseJoinColumns = { @JoinColumn(name = JVUC_COLUMN_USECASE, referencedColumnName = UseCase.COLUMN_ID) })
    private final Set<UseCase> useCases = new HashSet<UseCase>();

// setters and getters
}

@Entity
@Table(name = UseCase.TABLE_NAME)
public class UseCase {

    @Column(name = COLUMN_NAME, nullable = false)
    private String name;

// setters and getters
}

為了實現過濾器,我想使用spring.data.jpa.domain中的Spring Data Jpa和Specification

例如,我想查找具有給定用例名稱的UpdatePackage列表。

我知道對於ManyToOne關系,我需要使用Join;對於ManyToMany,我需要使用Fetch。

我的規范接口實現如下所示:

public static Specification<UpdatePackage> useCaseNames(final List<String> useCaseNames) {
        return new Specification<UpdatePackage>() {

            @Override
            public Predicate toPredicate(Root<UpdatePackage> root, CriteriaQuery<?> query,
                    CriteriaBuilder cb) {
                final Join<UpdatePackage, Version> version = root.join(UpdatePackage_.destVersion,
                        JoinType.LEFT);

                Fetch<Version, UseCase> useCase = version.fetch(Version_.useCases, JoinType.LEFT);
                return null;
                // return useCase.get(UseCase_.name).in(useCaseNames);

            }
        };
    }

當我運行集成測試時,我得到了NPException:

Fetch<Version, UseCase> useCase = version.fetch(Version_.useCases, JoinType.LEFT);

因為字段聯接和獲取對象版本為空。

我不知道我做錯了什么,在互聯網上找不到任何答案。

有人知道這段代碼有什么問題嗎?

堆棧:org.hibernate.ejb.criteria.path.Abs​​tractFromImpl.constructJoin(AbstractFromImpl.java:261)處的java.lang.NullPointerException,org.hibernate.ejb.criteria.path.Abs​​tractFromImpl.fetch(AbstractFromImpl.java:549)處

我找到了解決方案。 我在靜態模型中有一個錯誤。

靜態模型來自:

public static volatile SingularAttribute<Version, UseCase> useCases;

至:

public static volatile SetAttribute<Version, UseCase> useCases;

並在規范的實施中:

public static Specification<UpdatePackage> useCaseNames(final List<String> useCaseNames) {
        return new Specification<UpdatePackage>() {

            @Override
            public Predicate toPredicate(Root<UpdatePackage> root, CriteriaQuery<?> query,
                    CriteriaBuilder cb) {               
                final Join<UpdatePackage, Version> version = root.join(UpdatePackage_.destVersion,
                        JoinType.LEFT);
                final Join<Version, UseCase> useCase = version.join(Version_.useCases);
                return useCase.get(UseCase_.name).in(useCaseNames);
            }
        };
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM