Spring data jpa Spring数据JPA规范多对一关系

Spring data jpa Spring数据JPA规范多对一关系,spring-data-jpa,Spring Data Jpa,我刚刚接触Spring数据JPA,有两个实体,并遵循了stackoverflow的一些示例,但没有运气 用户--->*纳税 目标是获得与用户id相关的所有税款: User.java 公共类用户扩展AbstractAuditionEntity实现可序列化{ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

我刚刚接触Spring数据JPA,有两个实体,并遵循了stackoverflow的一些示例,但没有运气

用户--->*纳税

目标是获得与用户id相关的所有税款:

User.java

公共类用户扩展AbstractAuditionEntity实现可序列化{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
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;
}..
。。。。。。。。。。 }

TaxPayment.jva

公共类TaxPayment实现可序列化{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
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;
}..
}

我不想让User.java中的一个omany注释和Taxpayment中映射为User\u id的列

规格等级如下:

最终类纳税规范{

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

       }
    };

}
private TaxPaymentSpecification(){
}
静态规范hasUser(长用户ID){
返回新规范(){
@凌驾
公共谓词toPredicate(根arg0,标准查询arg1,
标准生成器(arg2){
//TODO自动生成的方法存根
根=arg0;
Subquery subqry=arg1.Subquery(Long.class);
Root用户=subqry.from(user.class);
final Join taxpays=root.Join(“用户”);
subqry.select(taxpays.get(“用户id”));
其中(arg2.equal(user.get(“id”),userId));
返回arg2.in(arg0.get(“用户id”)).value(subqry);
}
};
}
}

任何人都可以根据我的目标检查此规范是否正确/错误。(以获取与用户id相关的所有税费)

提前谢谢。
Nyamath

如果您已经知道用户id,则无需使用子查询,该用户id将是TaxPayment表中用户id的值:

@Override
public Predicate toPredicate(Root<TaxPayment> arg0, CriteriaQuery<?> arg1, 
        CriteriaBuilder arg2) {
  return arg2.equal(arg0.get("user_id"), userId);
}
@覆盖
公共谓词toPredicate(根arg0,标准查询arg1,
标准生成器(arg2){
返回arg2.equal(arg0.get(“用户id”),userId);
}