我正在开发一个经常使用CriteriaBuilder.Coalesce和Root的大型代码库。例如,criteriaBuilder.coalesce(root.get('adjustedWeight'), root.get('weight'))
我不明白这种语法。例如,Coalesce API似乎只接受1个类型为Expression<? extends T>
或T
的参数。我也不明白“根”是什么或为什么有用。
为了帮助我理解,我正在创建一个简化示例,该示例使用上面的代码行以及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);
换句话说,必须以不同的方式实例化
CriteriaBuilder
和CriteriaQuery
才能使构建正常工作。例如。整个CriteriaQuery<Entity class>
语法对我来说没有意义。 最佳答案
看来您获得了错误的API文档,正确的是this。合并方法(如SQL pendant)仅返回第一个非空值,因此,如果adjustedWeight
的值不为null,则返回weight
的值,否则返回root
的值,或者如果没有值,则返回至少为null的值存在。
在您的情况下,... FROM ...
变量仅表示您正在处理的表,它们分别表示查询的根(SQL查询转换为)。名称是任意的。 As database term this would be the selection。 This article也可以为您提供帮助。