当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA规范多对一关系

齐英朗
2023-03-14

我在Spring Data JPA中有两个实体:

User--->* TaxPayment 

目标是获取与user\u id相关的所有税款:

User.java

public class User extends AbstractAuditingEntity implements Serializable {

    private static final long serialVersionUID = 1L;

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

..........
}

税务ayment.jva

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

我不想要一个太多的注释从User.java和列映射在纳税user_id。

规格等级如下:

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

           }
        };
        
    }
}

根据我获取所有与user\u id相关的税款的目标,规范是正确的还是错误的?

共有1个答案

姜华翰
2023-03-14

如果您已经知道userId,则不需要使用子查询,它将是user_id的值:

@Override
public Predicate toPredicate(Root<TaxPayment> arg0, CriteriaQuery<?> arg1, 
        CriteriaBuilder arg2) {
  return arg2.equal(arg0.get("user_id"), userId);
}
 类似资料:
  • 问题内容: 我有一个设置,其中猫可以由许多所有者拥有,每个所有者可以拥有几只猫。鉴于此,我想写一个说明来帮助我找到具有给定主人姓名的所有猫。 这是一个简单的类设置。 *为简洁起见,没有getters / setter。id字段在超类中。 *为简洁起见,没有getters / setter。id字段在超类中。 这是一个存储库,其中包含有效的查询和无效的规范。 请帮我写规范。 我遇到的麻烦是,这种关系

  • 我希望在消费者和政策这两个实体之间建立一对多关系。一个消费者应该有几个政策。 这是我想要的一个消费JSON对象的例子: 这就是我到目前为止所做的: 政策实体 消费者实体 我想没那么难,但我已经试了几个小时了,还是做不到。我刚到Spring,所以如果有人能帮助我,我会非常感激!

  • 我按照本教程获得了Spring Data JPA规范:https://dzone.com/articles/using-spring-data-jpa-specification 它为我实现了这一点,但我不能调用规范方法来搜索它们。我想把它们放在我的SearchController中: 现在我想在我的SearchController(比如Controller)中调用这个方法,但我不知道如何调用。目

  • 我有一个设置,猫可以由许多主人拥有,每个主人可以拥有几只猫。有鉴于此,我想写一个规范来帮助我找到所有拥有给定主人名字的猫。 下面是一个简单的类设置。 *简洁性方面没有获得者/接受者。Id字段位于超类中。 *简洁性方面没有获得者/接受者。Id字段位于超类中。 这是一个存储库,其中有一个有效的查询和一个无效的规范。 请帮我写一下说明书。 我遇到的问题是,这种关系似乎需要与这种关系的表达方式背道而驰:主

  • 我正在回答这个问题,在单个表的日期、整数和字符串数据类型字段上执行多列搜索?并且该方法必须返回Java 8中类型specification 的结果。 实际上,我想在关联实体中搜索,以及全局搜索的一部分。使用是否可能? 我有和@onetomany关系。 EmployeeController.java java 当我点击时,我希望在表和表中进行搜索(可能使用类似)。这可能吗?如果是,我们怎么做? 有什

  • 母实体 子实体 代码持久化 请告诉我这些步骤是否正确。我有以下例外。并且无法理解为什么父id在子表中不可用 原因:org.hibernate.exception.ConstraintViolation异常:无法将值NULL插入到列PARAM_REF_ID,表PARAM中;列不允许空值。INSERT失败。