ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-08 13:04:04  阅读:309  来源: 互联网

标签:java jpa filter hibernate 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”中所做的是错的?
请真的需要帮助.

先感谢您!

解决方法:

使用规范的Metamodel和几个连接,它应该工作.如果您从以下伪代码(未测试)获得一些提示,请尝试:

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

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

标签:java,jpa,filter,hibernate,criteria
来源: https://codeday.me/bug/20191008/1871973.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有