gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:42:45 26 4
gpt4 key购买 nike

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

[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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com