Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何使用JPA Criteria Builder编写查询(包括子查询和exists)_Hibernate_Jpa_Jpa 2.0_Criteria - Fatal编程技术网

Hibernate 如何使用JPA Criteria Builder编写查询(包括子查询和exists)

Hibernate 如何使用JPA Criteria Builder编写查询(包括子查询和exists),hibernate,jpa,jpa-2.0,criteria,Hibernate,Jpa,Jpa 2.0,Criteria,正在努力使用JPA编写以下查询 Oracle查询: 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编写复杂查询的好教程。您可以使用J

正在努力使用JPA编写以下查询

Oracle查询:

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编写复杂查询的好教程。

您可以使用JPA查询或HQL而不是Criteria Builder更简单:

从Entity1中选择e1作为e1 哪里有 从Entity2中选择e2作为e2并将e2.e3作为ent3 其中ent3.id=e1.id和e2.name='Test'
我将使用JpaRepository、JpaSpecificationExecutor、CriteriaQuery、CriteriaBuilder回答简单汽车广告领域广告、品牌、模型的示例:

品牌[一对多]模式 模型[一对多]广告 实体:


我理解,但要求是使用criteria Builder:criteria Builder有其自身的局限性,因此最好根据情况将其与查询相结合。不要试着用螺丝刀钉钉子,这会让你在困难中变得轻松。嗨,这是一个很好的例子。当您执行brand.setId时。。。我找不到criteria.getValue的来源。它应该是this.brandId成员变量吗?哇,我刚刚把它转换成强类型。我的org.springframework.data.jpa.domain.Specification使用通过创建import javax.persistence.metamodel.SingularAttribute实现的强类型;以及MyObject_uu类中的@javax.persistence.metamodel.StaticMetamodelMyObject.class。唷!这是一个很大的伏都教让它工作。感谢这个例子,它让我从地面!
@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=?)