Java Spring数据Jpa和规范-如何处理多通和多通关系?

Java Spring数据Jpa和规范-如何处理多通和多通关系?,java,jpa,spring-data,spring-data-jpa,Java,Jpa,Spring Data,Spring Data Jpa,我的项目中有一个简单的模型 [UpdatePackage]>-(多个)-(版本)-

我的项目中有一个简单的模型

[UpdatePackage]>-(多个)-(版本)-<[UseCase]-(多个)

public类UpdatePackage实现了可比较的{
@manytone(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name=COLUMN\u ORIG\u VERSION,nullable=true)
私有版本或版本;
//二传手和接球手
}
@实体
@表(名称=版本。表\u名称)
公共类版本{
@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)})
私有最终集用例=新HashSet();
//二传手和接球手
}
@实体
@表(name=UseCase.Table\u name)
公共类用例{
@列(name=Column\u name,nullable=false)
私有字符串名称;
//二传手和接球手
}
对于过滤器的实现,我想使用Spring.Data.Jpa.domain中的Spring数据Jpa和规范

例如,我想找到具有给定用例名称的UpdatePackage列表

我知道对于多人关系,我需要使用Join,对于多人关系,我需要使用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);

            }
        };
    }
公共静态规范useCaseNames(最终列表useCaseNames){
返回新规范(){
@凌驾
公共谓词toPredicate(根根、标准查询、,
标准生成器(cb){
最终连接版本=root.Join,
类型(左);
Fetch useCase=version.Fetch(version.useCases,JoinType.LEFT);
返回null;
//返回useCase.get(useCase.name).in(useCaseNames);
}
};
}
当我运行集成测试时,我在第行中得到了NPException:

Fetch<Version, UseCase> useCase = version.fetch(Version_.useCases, JoinType.LEFT);
Fetch useCase=version.Fetch(version.useCases,JoinType.LEFT);
因为对象版本的字段联接和获取为空

我不知道我做错了什么,在网上也找不到答案

有人知道这个代码有什么问题吗

堆栈: java.lang.NullPointerException 位于org.hibernate.ejb.criteria.path.AbstractFromImpl.constructJoin(AbstractFromImpl.java:261)
在org.hibernate.ejb.criteria.path.AbstractFromImpl.fetch(AbstractFromImpl.java:549)上,我找到了一个解决方案。我在静态模型中有一个bug

静态模型 发件人:

公共静态属性用例;
致:

publicstaticvolatilesetattribute用例;
在实施规范时:

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);
            }
        };
    }
公共静态规范useCaseNames(最终列表useCaseNames){
返回新规范(){
@凌驾
公共谓词toPredicate(根根、标准查询、,
准则(cb){
最终连接版本=root.Join,
类型(左);
最终连接用例=version.Join(version.useCases);
返回useCase.get(useCase.name).in(useCaseNames);
}
};
}

我找到了解决办法。我在静态模型中有一个bug

静态模型 发件人:

公共静态属性用例;
致:

publicstaticvolatilesetattribute用例;
在实施规范时:

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);
            }
        };
    }
公共静态规范useCaseNames(最终列表useCaseNames){
返回新规范(){
@凌驾
公共谓词toPredicate(根根、标准查询、,
准则(cb){
最终连接版本=root.Join,
类型(左);
最终连接用例=version.Join(version.useCases);
返回useCase.get(useCase.name).in(useCaseNames);
}
};
}

我找到了解决办法。我在静态模型中有一个bug

静态模型 发件人:

公共静态属性用例;
致:

publicstaticvolatilesetattribute用例;
在实施规范时:

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);
            }
        };
    }
公共静态规范useCaseNames(最终列表useCaseNames){
返回新规范(){
@凌驾
公共谓词toPredicate(根根、标准查询、,
准则(cb){
最终连接版本=root.Join,
类型(左);
最终连接用例=version.Join(version.useCases);
返回useCase.get(useCase.name).in(useCaseNames);
}
};
}

我找到了解决办法。我在静态模型中有一个bug

静态模型 发件人:

公共静态属性用例;
致:

publicstaticvolatilesetattribute用例;
在实施规范时:

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);
            }
        };
    }
公共静态规范useCaseNames(最终列表useCaseNames){
返回新规范(){
@凌驾
公共谓词toPredicate(根根、标准查询、,
准则(cb){
最终连接版本=root.Join,
类型(左);
最终连接用例=version.Join(version.useCases);
返回useCase.get(useCase.name).in(useCaseNames);
}
};
}