JPA / Hibernate:CriteriaBuilder - 如何使用关系对象创建查询?

Posted

技术标签:

【中文标题】JPA / Hibernate:CriteriaBuilder - 如何使用关系对象创建查询?【英文标题】:JPA / Hibernate: CriteriaBuilder - How to create query using relationship object? 【发布时间】:2012-02-18 13:16:22 【问题描述】:

我有以下四张表:

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" 中所做的事情是错误的? 请真的需要帮助。

提前谢谢你!

【问题讨论】:

【参考方案1】:

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

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

要了解 Criteria Queries,请查看以下教程: http://www.ibm.com/developerworks/java/library/j-typesafejpa/ http://docs.oracle.com/javaee/6/tutorial/doc/gjitv.html

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

【讨论】:

嗨 perissf。感谢您的帮助。但我没有类“ScheduleRequest_”、“UserApplication_”、“User_”。我如何创建它们?而且在您的伪代码中,您没有包含“应用程序”表?关系表是 USER_APPLICATION 表,关联 USER 和 APPLICATION 表。请多多指教。真的很感激。谢谢。 我在这里看到了一些教程,但我不确定如何在我的案例中应用它。 altuure.com/2010/09/23/… 我已经通过添加一些参考资料并根据您的信息添加第三个连接来更新我的答案

以上是关于JPA / Hibernate:CriteriaBuilder - 如何使用关系对象创建查询?的主要内容,如果未能解决你的问题,请参考以下文章

spring.jpa.hibernate.hbm2ddl 和 spring.jpa.hibernate.ddl 之间的区别

JPA和Hibernate的关系

Spring Hibernate JPA 联表查询

Spring Hibernate JPA 联表查询 复杂查询

JPA 等同于 Hibernate org.hibernate.criterion.Example?

Hibernate JPA 的异常