java - JPA/hibernate : CriteriaBuilder - How to create query using relationship object?

标签 java hibernate jpa filter criteria

我有以下四个表:

SCHEDULE_REQUEST 表: ID, APPLICATION_ID(FK)

应用表: ID, 代码

USER_APPLICATION 表: APPLICATION_ID(FK), USER_ID(FK)

用户表: ID, 姓名

现在我想创建一个 CriteriaBuilder,其中条件是为指定的用户 ID 选择 ScheduleRequests

我有以下代码:

List<User> usersList = getSelectedUsers(); // userList contains users I wanted to select

CriteriaBuilder builder = getJpaTemplate().getEntityManagerFactory().getCriteriaBuilder();
CriteriaQuery<ScheduleRequest> criteria = builder.createQuery(ScheduleRequest.class);
Root<ScheduleRequest> scheduleRequest = criteria.from(ScheduleRequest.class);
criteria = criteria.select(scheduleRequest);

ParameterExpression<User> usersIdsParam = null;
if (usersList != null) {
    usersIdsParam = builder.parameter(User.class);
    params.add(builder.equal(scheduleRequest.get("application.userApplications.user"), usersIdsParam));
}

criteria = criteria.where(params.toArray(new Predicate[0]));

TypedQuery<ScheduleRequest> query = getJpaTemplate().getEntityManagerFactory().createEntityManager().createQuery(criteria);

// Compile Time Error here:
// The method setParameter(Parameter<T>, T) in the type TypedQuery<ScheduleRequest> is not 
// applicable for the arguments (ParameterExpression<User>, List<User>)
query.setParameter(usersIdsParam, usersList);

return query.getResultList();

你能帮我如何将查询过滤器传递给关系对象吗? 我认为我在 "application.userApplications.user" 中所做的是错误的? 请真的需要帮助。

提前致谢!

最佳答案

使用规范的元模型和几个连接,它应该可以工作。如果您从以下伪代码(未测试)中得到一些提示,请尝试:

...
Predicate predicate = cb.disjunction();
if (usersList != null) {
    ListJoin<ScheduleRequest, Application> applications = scheduleRequest.join(ScheduleRequest_.applications);
    ListJoin<Application, UserApplication> userApplications = applications.join(Application_.userApplications);
    Join<UserApplication, User> user = userApplications.join(UserApplication_.userId);
    for (String userName : usersList) {
        predicate = builder.or(predicate, builder.equal(user.get(User_.name), userName));
    }
}

criteria.where(predicate); 
...

为了理解条件查询,请查看这些教程: http://www.ibm.com/developerworks/java/library/j-typesafejpa/ http://docs.oracle.com/javaee/6/tutorial/doc/gjitv.html

第二个链接还应指导您如何使用元模型类,这些类应由编译器/IDE 自动构建。

关于java - JPA/hibernate : CriteriaBuilder - How to create query using relationship object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9001289/

相关文章:

java - java中锁机制的实现查询

java - Hibernate 一对一映射问题

java - 如何在 JPQL 中对 Mysql 获取执行联接查询

java - 多个JTA事务: no session associated with the current transaction

java - @Embeddable 中的实体在用作 @EmbeddedId 时忽略级联注释

java - 在命令行的类路径中包含 jars(javac 或 apt)

java - 由于 AsyncTask onPostExecute(),ArrayAdapter<String> 中出现 Android NullPointerException

java - 运行 junit 测试一定时间

hibernate - 使用持久性类默认构造函数创建 SessionFactory 对象

java - 为什么Tomcat8环境中EntityManager不通过@PersistenceContext注入(inject)?