2017-03-26 3 views
0

Ich bin nur neu zu den Spring Data JPA und haben zwei Entitäten und folgten einige Beispiele aus stackoverflow, aber es gibt kein Glück.Spring Data JPA Spezifikation Manyto One realtionship

Benutzer ---> * TaxPayment

Das Ziel ist es, die alle taxpayments user_id mit Bezug zu bekommen:

User.java

public class User erweitert AbstractAuditingEntity implementiert Serializable {

private static final long serialVersionUID = 1L; 

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

.......... }

TaxPayment.jva

public class TaxPayment implementiert 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; 
}.. 

}

I OneToMany Annotation nicht aus User.java und die Spalte abgebildet in der Taxpayment als User_id wan't zu haben.

Spezifikation Klasse wie folgt:

final class 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); 

     } 
    }; 

} 

}

Kann jemand diese Spezifikation überprüfen, wie pro mein Ziel richtig/falsch (zu allen TaxPayment verwandten zu erhalten. zu Benutzer-ID).

Danke in fortgeschrittenem. Nyamath

Antwort

0

Es gibt keine Notwendigkeit, Unterabfrage zu verwenden, wenn Sie bereits die userId wissen, was der Wert von user_id in TaxPayment Tabelle sein:

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