设置 CriteriaBuilder

Setting up CriteriaBuilder

我正在开发一个经常使用 CriteriaBuilder.Coalesce and Root 的大型代码库。例如,

criteriaBuilder.coalesce(root.get('adjustedWeight'), root.get('weight'))

我不明白这个语法。其一,Coalesce API 似乎只接受 1 个 Expression<? extends T>T 类型的参数。我也不明白 Root 是什么,为什么有用。

为了帮助我理解,我正在创建一个简化示例,该示例使用上面的代码行以及 CriteriaBuilder 和 Root。我已经成功连接了 Hibernate 和 JPA。

请记住,我有大约 3 天的 Java 编程经验。我的母语是 C#

import models.MyEntity;
import org.hibernate.jpa.HibernatePersistenceProvider;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceProvider;
import java.util.HashMap;
import java.util.List;


public class Main {
    public static final String SELECT_QUERY = "from MyEntity where title = :title";

    public static void main(String[] args) {
            String title = "secureexam";
            PersistenceProvider persistenceProvider = new HibernatePersistenceProvider();
            EntityManagerFactory entityManagerFactory = persistenceProvider
                    .createEntityManagerFactory("NewPersistenceUnit", new HashMap());
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            List<MyEntity> result = entityManager
                    .createQuery(SELECT_QUERY, MyEntity.class)
                    .setParameter("title", title)
                    .getResultList();

            System.out.println("result is " + result.get(0).getTitle());
            entityManager.close();
    }
}

能否向我解释一下关于 criteriaBuilder 的第一行代码?另外,如何修改我的代码以使用这行代码?

更新

Kevin Peters 回答中提到的文章稍作修改即可:

    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Entity> criteriaQuery = criteriaBuilder.createQuery(Entity.class);

//Test 1
Root<AssessmentEntity> rootTest1 = criteriaQuery.from(Entity.class);

换句话说,CriteriaBuilderCriteriaQuery 必须以不同的方式实例化才能使构建工作。例如。整个 CriteriaQuery<Entity class> 语法对我来说没有意义。

看来你弄错了 API 文档,正确的是 this. The coalesce method (like the SQL pendant) 只是 returns 第一个非空值,所以 adjustedWeight 如果不为 null,则为 weight 的值,或者如果存在 none 个值,则至少为 null。

您的 root 变量仅代表您正在处理的 table,分别代表您查询的根(SQL 查询翻译将是 ... FROM ...).名字随意。 As database term this would be the selection. This article 也可以帮到你。