设置CriteriaBuilder

时间:2017-05-06 02:43:16

标签: java sql hibernate jpa criteria-api

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

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

我不明白这种语法。例如,Coalesce API似乎只接受Expression<? extends T>T类型的1个参数。我也不明白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,请您解释一下第一行代码?另外,如何修改我的代码以使用这一行代码?

更新

凯文彼得斯回答中提到的文章略有修改:

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

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

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

1 个答案:

答案 0 :(得分:1)

似乎你得到了错误的API文档,正确的是this。 coalesce方法(如SQL pendant)只返回第一个非null值,因此adjustedWeight的值如果不为null,则为weight的值,或者至少为root的值如果没有值,则返回null。

您的案例中的... FROM ...变量只代表您正在处理的表,它们分别代表查询的根(SQL查询转换为mainApp.controller('navBarController', ['$scope', '$http', '$q', function($scope, $http, $q){ $scope.profileID = ''; var getProfileID = function(){ return $http.get('/session'); }; getProfileID().then(function(res) { console.log($scope.profileID = res.data.facebookProfileId);//this gives me the profileID as expected $scope.profileID = res.data.facebookProfileId; }); }]); )。这个名字是任意的。 As database term this would be the selectionThis article也可以帮到你。