私は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