当前位置: 首页 > 面试题库 >

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

林英锐
2023-03-14
问题内容

我有以下四个表:

SCHEDULE_REQUEST表: ID,APPLICATION_ID(FK)

应用表: ID,代码

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

用户表: ID,NAME

现在,我想创建一个CriteriaBuilder条件条件,以便ScheduleRequests为指定的用户ID 选择。

我有以下代码:

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自动构建。



 类似资料:
  • 我有个问题。当我有其他实体时,我不知道如何创建API。我与邮递员工作,当我做一个请求,以看到所有项目从数据库,我想收到实体也。 例如,这是我的实体:

  • 非常感谢所有的帮助,  · ·提尔曼

  • 问题内容: 我需要使用NDK以及JNI将一些功能实现到Android应用程序中。 这是我所写的C代码: 我的问题或多或少在代码内得到了解释。也许还可以:函数(jobject)的返回类型可以吗? 现在,NDKTest.java: 当我尝试运行代码时,它不起作用。 问题答案: 既然是内部类,那么获得它的方法就是 内部类的约定在权威规范中并未真正明确记录,但是根深蒂固地存在于如此多的工作代码中,因此不太

  • 主要内容:ORM框架,映射方向,映射类型对象关系映射(ORM)是一种功能,用于通过将对象状态映射到数据库列来开发和维护对象和关系数据库之间的关系。 它能够轻松处理(或执行)各种数据库操作,如插入,更新,删除等。 ORM框架 以下是在ORM机制上运行的一些框架 - Hibernate (参考:http://www.yiibai.com/hibernate ) TopLink ORMLite iBATIS JPOX 映射方向 映射方向可分为

  • 问题内容: 我开始学习JPA,并已基于我在SQL Server中测试的以下本机SQL实现了JPA查询示例: 通过上面的SQL,我构造了以下JPQL查询: 如您所见,我仍然缺少原始查询中的条件。我的问题是,如何将其放入JPQL? 问题答案: 写这个; 因为您的学生实体与ClassTbl实体具有一对多关系。

  • 现在我需要正在学习‘程序设计’课程的学生名单 如何使用条件查询实现这一点。