2017-03-26 61 views
0

我剛剛接觸Spring Data JPA,並且有兩個實體,並遵循了幾個來自stackoverflow的示例,但沒有運氣。彈簧數據JPA規範Manyto One realtionship

用戶---> * TaxPayment

我們的目標是讓所有user_id說明相關taxpayments:

User.java

公共類用戶擴展AbstractAuditingEntity實現Serializable {

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

.......... }

TaxPayment.jva

公共類TaxPayment實現Serializable {

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@NotNull 
@Column(name = "payment_date", nullable = false) 
private LocalDate paymentDate; 

@NotNull 
@Column(name = "amount", precision=10, scale=2, nullable = false) 
private BigDecimal amount; 

@Column(name = "reference") 
private String reference; 

@ManyToOne 
private User user; 

public Long getId() { 
    return id; 
}.. 

}

我不wan't有從User.java OneToMany註釋和在Taxpayment映射爲USER_ID的列。

規範類,如下所示:

final類TaxPaymentSpecification {

private TaxPaymentSpecification(){ 

} 

static Specification<TaxPayment> hasUser(Long userId){ 
    return new Specification<TaxPayment>() { 

     @Override 
     public Predicate toPredicate(Root<TaxPayment> arg0, CriteriaQuery<?> arg1, 
       CriteriaBuilder arg2) { 
      // TODO Auto-generated method stub 
      Root<TaxPayment> root = arg0; 
      Subquery<Long> subqry = arg1.subquery(Long.class); 
      Root<User> user = subqry.from(User.class); 

      final Join<User,TaxPayment> taxpays = root.join("user"); 

      subqry.select(taxpays.<Long> get("user_id")); 

      subqry.where(arg2.equal(user.<Long> get("id"),userId)); 
      return arg2.in(arg0.get("user_id")).value(subqry); 

     } 
    }; 

} 

}

任何人都可以查看此規範是正確/錯誤按我的目標(讓所有的TaxPayment相關。到user_id)。

謝謝先進。 Nyamath

回答

0

沒有必要使用子查詢,如果你已經知道的用戶id,這將是USER_ID的TaxPayment表中的值:

@Override 
public Predicate toPredicate(Root<TaxPayment> arg0, CriteriaQuery<?> arg1, 
     CriteriaBuilder arg2) { 
    return arg2.equal(arg0.get("user_id"), userId); 
}