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

如何使用JPA条件生成器编写查询(包括子查询和exists)

阎成天
2023-03-14
Select * from table1 s
where exists (Select 1 from table2 p
              INNER JOIN table3 a ON a.table2_id = p.id
              WHERE a.id = s.table3_id
              AND p.name = 'Test');

此外,您是否愿意指出任何好的教程,以编写复杂的查询在JPA。

共有1个答案

高才
2023-03-14

我将使用JpaRepository、JpaSpecificationExecutor、CriteriaQuery、criteriaBuilder回答简单的汽车广告域(advert、brand、model)的示例:

  • 品牌[一对多]型号
  • 模型[一对多]广告

实体:

@Entity
public class Brand {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  private String name;
  @OneToMany(mappedBy = "brand", fetch = FetchType.EAGER)
  private List<Model> models;
}

@Entity
public class Model {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  private String name;
  @ManyToOne
  @JoinColumn(name = "brand_id")
  private Brand brand;
}

@Entity
public class Advert {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  @ManyToOne
  @JoinColumn(name = "model_id")
  private Model model;
  private int year;
  private int price;
}
public interface AdvertRepository
  extends JpaRepository<Advert, Long>, JpaSpecificationExecutor<Advert> {
}
public class AdvertSpecification implements Specification<Advert> {
  private Long brandId;

  public AdvertSpecification(Long brandId) {
    this.brandId = brandId;
  }

  @Override
  public Predicate toPredicate(Root<Advert> root,
                               CriteriaQuery<?> query,
                               CriteriaBuilder builder) {

    Subquery<Model> subQuery = query.subquery(Model.class);
    Root<Model> subRoot = subQuery.from(Model.class);

    Predicate modelPredicate = builder.equal(root.get("model"), subRoot.get("id"));

    Brand brand = new Brand();
    brand.setId(brandId);
    Predicate brandPredicate = builder.equal(subRoot.get("brand"), brand);

    subQuery.select(subRoot).where(modelPredicate, brandPredicate);
    return builder.exists(subQuery);
  }
}
select advert0_.id as id1_0_,
       advert0_.model_id as model_id5_0_,
       advert0_.price as price3_0_,
       advert0_.year as year4_0_
from advert advert0_
where exists (select model1_.id from model model1_
              where advert0_.model_id=model1_.id
              and model1_.brand_id=?)
 类似资料:
  • 问题内容: 谁能帮助我获取下面提到的JPA查询的JPA标准查询。 问题答案: 假设Person与语言有关,这就是您在较早的Hibernate中所做的事情: 我第一次尝试使用JPA 2.0: 请让我知道这是否适合您。 编辑: 更新查询以仅使用一个呼叫。

  • 问题内容: 我有一个用于Elasticsearch的简单JSON查询,如下所示: 仅当值(在这种情况下为“ a1”)不为空时,才如何执行第二个“必须”条件? 问题答案: 您可以使用以下方法实现它-

  • 如何在Hibernate中为下面给定的查询编写criteria builder api查询?batchId不是主键 从用户中选择批号('1','3') 我尝试过: 除了数据库中存在的数据外,我什么也得不到。

  • 我在mySql中有一个查询,我想在我的控制器中编写。 原因:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:应为CLOSE,在org.hibernate.internal.exceptionConverterImpl.convert(exceptionConverterIm

  • 我试图使用CritierBuilder/CrtieriaQuery执行select语句,从表a中选择某些字段,然后如果该记录存在于另一个表中,则使用布尔标志。 基本上,我有一个“官员”列表和一个用户列表。用户是使用该系统的人,可以为官员添加书签/保存信息。当用户询问官员时,我希望能够显示他们已经为哪些官员添加了书签。 所以这个查询,我在我的h2数据库控制台中运行,它(相当)有效。如果官员被用户12