【问题标题】:Spring Data JPA Specification Manyto One realtionshipSpring Data JPA 规范多对一关系
【发布时间】:2017-08-19 01:07:11
【问题描述】:

我是 Spring Data JPA 的新手,有两个实体,并遵循了一些来自 stackoverflow 的示例,但没有运气。

用户--->* 纳税

目标是获取与user_id相关的所有税款:

用户.java

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

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

}

我不想让来自 User.java 的 oneTOMany 注释和在 Taxpayment 中映射为 user_id 的列。

规范类如下:

最终类 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);

       }
    };

}

}

任何人都可以根据我的目标查看此规范是否正确。(获取与 user_id 相关的所有 TaxPayment)。

提前致谢。 尼玛特

【问题讨论】:

    标签: spring-data-jpa


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-09
      • 2015-10-28
      • 2017-10-28
      • 2018-05-07
      • 2018-04-14
      • 1970-01-01
      • 2016-07-22
      • 2020-08-10
      • 1970-01-01
      相关资源
      最近更新 更多