java - Spring Data Jpa 和规范 - 如何处理 ManyToOne 和 ManyToMany 关系?

标签 java jpa spring-data spring-data-jpa

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

[UpdatePackage] >- (ManyToOne) - [版本] -< [用例] - (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 和 spring.data.jpa.domain 中的规范

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

我知道对于ManyToOne关系我需要使用Join,对于ManyToMany我需要使用Fetch。

我的规范接口(interface)的实现如下所示:

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

因为对象版本的字段连接和获取都是空的。

我不知道我做错了什么,我在互联网上找不到任何答案。

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

堆栈: java.lang.NullPointerException 在 org.hibernate.ejb.criteria.path.Abs​​tractFromImpl.constructJoin(AbstractFromImpl.java:261) 在 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);
            }
        };
    }

关于java - Spring Data Jpa 和规范 - 如何处理 ManyToOne 和 ManyToMany 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29393607/

相关文章:

spring - 如何使用 Spring Data JPA 根据 bool 参数包含或排除记录?

java - 尝试登录时应用程序崩溃(使用解析对象)

Java FIFO队列实现

java - Apache CXF 客户端 soap 故障处理

java - 无法在 Glassfish 上部署我的项目

spring - 使用 Spring Data 存储库在 Mongodb 中获取最后创建的文档

java - Spring 安全: activating csrf disables/logout

java - 容器管理的持久性和创建临时表的存储过程

java - 比较数据库日期与 Java 日期

java - ElasticSearch Java 客户端查询嵌套对象