Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 关于JPA2.0标准的一些基本问题_Hibernate_Jpa_Jpa 2.0_Criteria Api - Fatal编程技术网

Hibernate 关于JPA2.0标准的一些基本问题

Hibernate 关于JPA2.0标准的一些基本问题,hibernate,jpa,jpa-2.0,criteria-api,Hibernate,Jpa,Jpa 2.0,Criteria Api,我今天发现了JPA2.0标准API,并想学习它。只是通过一些例子,试着做一个实际操作。我有一个带列的水果桌: 身份证 名字 颜色 大小 品味 常规材料: EntityManagerFactory emf = Persistence.createEntityManagerFactory("fruitManager"); EntityManager em = emf.createEntityManager(); //get the criteria builder CriteriaBuilde

我今天发现了JPA2.0标准API,并想学习它。只是通过一些例子,试着做一个实际操作。我有一个带列的水果桌:

  • 身份证
  • 名字
  • 颜色
  • 大小
  • 品味
常规材料:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("fruitManager");
EntityManager em = emf.createEntityManager();

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

CriteriaQuery<Fruit> c = cb.createQuery(Fruit.class);
即如何:

  • 只取一些列
  • 包括通配符搜索
  • 包括和,或其中的条件。

  • 另外,在获取实际数据之前,最好先获得结果的计数。如何首先获取结果计数

  • 还有什么地方可以让我获得更多关于几种不同类型SQL查询的“条件”的示例吗?

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

    @Entity
    public class Fruit {
        @Id int id;
        String name;
        String color;
    }
    
    当结果由单独的列组成时,查询的类型参数是Object[].class(结果将是Object[]的列表)。另一种可能是使用Tuple。您可以构建以下描述的查询。为了便于举例说明参数的类型,为谓词和ParameterExpression创建了中间变量。您还可以将它们内联到查询创建中

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

    有关criteria API的基本教程,请访问


    示例可以在中找到,也可以查看第2部分。

    我想补充一点,您可以使用metamodel generation进行全类型查询,metamodel generation是一个在构建时自动生成用于列选择的类的插件
    cb.like(root.get(“name”)
    可以通过
    cb.like(root.get(Fruit.name)、colorParamExp)
    进行交换。我还想补充一点,设置参数是一个不必要的步骤,您可以简单地将colorParamExp替换为文本、
    cb.like(root.get(Fruit.name)、“orange”)
    或者在某些情况下使用`cb.like(root.get(Fruit.name)),cb.literal(“橙色”))可能需要。是否只有在实体类不存在的情况下才使用元模型生成插件?设置参数只是为了显示示例。在第二个代码块中,它是用文字完成的。使用规范元模型也是我更喜欢的方式。在学习阶段,我将从基于字符串开始,并引入大量的中间代码diate对象只是为了加深对参数类型的理解。下一步是编写元模型并使用它。然后生成元模型。@Nikunj,不是。只需查看Rasmus Franke在其回答中提供的链接后面的文档。谢谢!将查看文档!谢谢!!将查看文档!!
    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);
    }
    
    @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")));