gpt4 book ai didi

hibernate - 关于 JPA 2.0 标准的一些基本问题

转载 作者:行者123 更新时间:2023-12-03 12:25:14 26 4
gpt4 key购买 nike

我今天发现了 JPA 2.0 Criteria API 并想学习它。刚刚经历了一些例子并尝试动手。我有一个带列的表水果:

  • id,
  • 姓名,
  • 颜色,
  • 尺寸,
  • 品尝。

  • 常规的东西:
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("fruitManager");
    EntityManager em = emf.createEntityManager();

    //get the criteria builder
    CriteriaBuilder cb = em.getCriteriaBuilder();

    CriteriaQuery<Fruit> c = cb.createQuery(Fruit.class);
  • 以下查询将如何使用条件构建:
    select id, name, color where name like 'XY%' and  color='orange'

    IE。如何:
  • 只获取一些列,
  • 包括通配符搜索,
  • 包括 AND、OR where 条件。
  • 此外,在获取实际数据之前先计算结果总是更好。如何首先获取结果计数?

  • 还有什么地方可以让我通过几种不同类型的 SQL 查询获得更多关于“标准”的例子?

    最佳答案

    首先,您对实体进行操作,而不是对表进行操作,因此我将假设对 Fruit 进行以下映射:

    @Entity
    public class Fruit {
    @Id int id;
    String name;
    String color;
    }

    当结果由单独的列组成时,查询的类型参数是 Object[].class(结果将为 List of Object[])。另一种可能性是使用元组。您可以使用以下内容构建您描述的查询。只是为了举例说明参数的类型,为 Predicates 和 ParameterExpressions 创建了中间变量。您还可以将这些内联到查询创建中。
    CriteriaQuery<Object[]> myquery = cb.createQuery(Object[].class);
    Root<Fruit> root = myquery.from(Fruit.class);

    ParameterExpression<String> nameParamExp = cb.parameter(String.class, "name");
    ParameterExpression<String> colorParamExp = cb.parameter(String.class, "color");

    Predicate namePredicate = cb.like(root.<String>get("name"), colorParamExp);
    Predicate colorPredicate = cb.equal(root.get("color"), nameParamExp);

    myquery.multiselect(root.get("id"), root.get("name"), root.get("color"))
    .where(cb.and(namePredicate, colorPredicate));

    TypedQuery<Object[]> someFruits = em.createQuery(myquery);
    someFruits.setParameter("name", "XY%");
    someFruits.setParameter("color", "orange");

    someFruits.getResultList();

    您还可以通过内联所有内容来构建相同的查询:
    myquery.multiselect(root.get("id"), root.get("name"), root.get("color"))
    .where(cb.and(
    cb.like(root.<String>get("name"), "XY%"),
    cb.equal(root.get("color"), "orange")));

    或者使用元组作为结果类型:
    CriteriaQuery<Tuple> myquery = cb.createQuery(Tuple.class);
    Root<Fruit> root = myquery.from(Fruit.class);

    myquery.select(cb.tuple(root.get("id").alias("id"),
    root.get("name").alias("name"),
    root.get("color").alias("color")))
    .where(cb.and(
    cb.like(root.<String>get("name"), "XY%"),
    cb.equal(root.get("color"), "orange")));

    TypedQuery<Tuple> someFruits = em.createQuery(myquery);

    for (Tuple t: someFruits.getResultList()) {
    //access your results by alias set in query instead of using array index
    Integer id = t.get("id", Integer.class);
    String name = t.get("name", String.class);
    String color = t.get("color", String.class);
    }

    如果您选择规范的元模型,那么您需要在与您的水果相同的包中跟随类(class)。由您自己编写还是使用某些工具生成(例如使用 org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor)。第一次自己写才有意义:
    @StaticMetamodel(Fruit.class)
    public abstract class Fruit_ {
    public static volatile SingularAttribute<Fruit, Integer> id;
    public static volatile SingularAttribute<Fruit, String> color;
    public static volatile SingularAttribute<Fruit, String> name;
    }

    然后,您可以使用强类型参数并用以下内容替换之前元组示例中的查询:
    myquery.select(cb.tuple(root.get(Fruit_.id).alias("id"),
    root.get(Fruit_.name).alias("name"),
    root.get(Fruit_.color).alias("color")))
    .where(cb.and(
    cb.like(root.get(Fruit_.name), "XY%"),
    cb.equal(root.get(Fruit_.color), "orange")));

    关于hibernate - 关于 JPA 2.0 标准的一些基本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7790794/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com