2015-04-01 253 views
0

我在我的項目中有一個簡單的模型。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.Abs​​tractFromImpl.constructJoin(AbstractFromImpl.java:261) 在org.hibernate.ejb.criteria.path.Abs​​tractFromImpl.fetch( AbstractFromImpl.java:549)

回答

0

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

靜態模型 來源:

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); 
      } 
     }; 
    } 
相關問題