2017-03-26 9 views
0

私はSpring Data JPAの新機能であり、2つのエンティティを持ち、stackoverflowの例はほとんどありませんが、運はありません。Spring Data JPA Specification 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がシリアライズ{

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; 
}.. 

}

を実装IはoneTOMany User.javaから注釈とUSER_IDとしてTaxpaymentにマッピングカラムを有することwan'tいけません。

仕様クラスを次のように

最終クラス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

すでにTaxPaymentテーブル内のuser_idの値になりますのuserIdを、知っていれば、サブクエリを使用する必要はありません。

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