我在我的項目中有一個簡單的模型。Spring Data Jpa和Specification - 如何使用ManyToOne和ManyToMany關係?
[UpdatePackage〕> - (多對一) - 〔版] - < [用例] - (多對多)
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 JPA數據和規格從spring.data .jpa.domain
例如,我想查找具有給定usecase名稱的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);
因爲領域的連接和對象版本取空。
我不知道我做錯了什麼,我在互聯網上找不到任何答案。
有沒有人知道這段代碼有什麼問題?
堆棧: 顯示java.lang.NullPointerException 在org.hibernate.ejb.criteria.path.AbstractFromImpl.constructJoin(AbstractFromImpl.java:261) 在org.hibernate.ejb.criteria.path.AbstractFromImpl.fetch( AbstractFromImpl.java:549)