JPA 中的条件 where 子句

Posted

技术标签:

【中文标题】JPA 中的条件 where 子句【英文标题】:Conditional where clause in JPA 【发布时间】:2017-05-18 12:26:29 【问题描述】:

我有两个表“table1”和“table2”。对于 table1 中的每一行,table2 中可以有多个行。为了获取数据,我创建了以下类

@Entity
@EntityListeners(AuditingEntityListener.class) 
@Table(name = "table1", schema = "dbo")
public class Table1 extends BaseDomain
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer vendorId;
  private String name;
  private Integer companyId;
  private String details;

  @OneToMany(mappedBy = "table1",cascade = CascadeType.ALL)
  @NotFound(action = NotFoundAction.IGNORE)
  private Set<Table2> table2;

 // getter and setter for above

    @Entity
    @EntityListeners(AuditingEntityListener.class) 
    @Table(name = "table2", schema = "dbo")
    public class Table2 extends BaseDomain
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Integer id;
      private Integer cityId;
      private Integer companyId;
      @OneToOne
      @JoinColumn(name = "vendorId")
      @JsonIgnore
      private Table1 table1;

     // getter and setter for above
    

然后我创建了这样的存储库

@Transactional
public interface Table1Repository  extends JpaRepository<Table1, Integer> 

  Page<Table1> findByCompanyId(Integer companyId,Pageable pageable);


这将为我提供 table1 中根据 companyId 的行列表以及 Table2 中具有相应 vendorId 的行列表。

到目前为止,我的实现工作正常。

回应是


  "content": [
    
      "vendorId": 23,
      "name": "vendorname",
      "details": details,
      "table2": [
                 
                  "id" :1,
                 "cityId":1,
                 ,
                  "id" :2,
                  "cityId" : 3
                ]
    ,
   ....
]

目前我将 companyId 作为输入并给出上述响应。现在我也想将 cityId 作为输入。所以 table2 输出应该只包含给定 cityId 的详细信息。

那么任何人都可以帮助我如何实现它?我不想为 table1 和 table2 创建另一个模型。

【问题讨论】:

在回答之前,在第二个实体上,我认为你应该使用@ManyToOne 而不是@OneToOne 使用 CriteriaBuilder cb 并创建一个 CriteriaQuery query.where 使用 cb.equal 附加所有三个字段。 对不起!我是 JPA 的新手。你能解释一下吗?一些示例代码会有所帮助。 【参考方案1】:
Page<Table1> findByCompanyIdAndTable2_CityId(Integer companyId, Integer cityId, Pageable pageable);  

此方法将负责按 cityId 获取。 Underscore(_) 指的是嵌套字段。但要使其正常工作,您需要急切地获取 Table2。

@OneToMany(mappedBy = "table1",cascade = CascadeType.ALL, fetch=FetchType.EAGER)

【讨论】:

我还需要按companyId过滤数据 谢谢..让我试试这个 您的数据模型没有 companyId 字段? 否,但表中有一个名为 companyId 的列 你应该在你的数据模型中拥有它,否则 Spring data 无法使用网络名称为你创建查询

以上是关于JPA 中的条件 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

JPA标准WHERE子句

为啥我不能使用与 JPA 2.1 中的实体类型匹配的 TYPE-WHERE 子句查询实体?

Oracle Where(条件)子句用法

Oracle Where(条件)子句用法

Spring JPA:从没有where子句的表中查询一列

具有动态 where 子句的 Spring 数据 JPA