java - 休眠标准 - 或在标准之间?
问题描述
我有一个表 Prod,它与表用户有 3 个 fk 关系:
Prod
-----
id
user_id_1
user_id_2
user_id_3
User
-----
id
firstname
lastname
给定搜索表单上可能的 < firstname > 和 < lastname >,我想做类似(伪代码)的事情:
Find all Prod
where
(user_id_1.firstname like <firstname> AND user_id_1.lastname like <lastname>) OR
(user_id_2.firstname like <firstname> AND user_id_2.lastname like <lastname>) OR
(user_id_3.firstname like <firstname> AND user_id_3.lastname like <lastname>)
使用 Hibernate 的 Criteria 对象,我相信执行关联表操作的方法是使用附加的 Criteria 对象:
Criteria prodCriteria = session.createCriteria(Prod.class);
Criteria user1Criteria = prodCriteria.createCriteria("userId1");
LogicalExpression user1Le = Restrictions.and(Restrictions.ilike("firstame", <firstname>, MatchMode.ANYWHERE), Restrictions.ilike("lastname", <lastname>, MatchMode.ANYWHERE));
user1Criteria.add(user1Le);
Criteria user2Criteria = prodCriteria.createCriteria("userId2");
LogicalExpression user2Le = Restrictions.and(Restrictions.ilike("firstame", <firstname>, MatchMode.ANYWHERE), Restrictions.ilike("lastname", <lastname>, MatchMode.ANYWHERE));
user2Criteria.add(user2Le);
Criteria user3Criteria = prodCriteria.createCriteria("userId3");
LogicalExpression user3Le = Restrictions.and(Restrictions.ilike("firstame", <firstname>, MatchMode.ANYWHERE), Restrictions.ilike("lastname", <lastname>, MatchMode.ANYWHERE));
user3Criteria.add(user3Le);
但是,这不会在我想要 OR 的关联子标准对象之间产生 AND 吗?
有没有办法在子标准对象之间执行 OR?我会以正确的方式解决这个问题吗?
解决方案
您可以通过使用显式别名来实现它:
Criterion criterionUser1 = Restrictions.and(Restrictions.ilike("user1.firstname", firstname, MatchMode.ANYWHERE),
Restrictions.ilike("user1.lastname", lastname, MatchMode.ANYWHERE));
Criterion criterionUser2 = Restrictions.and(Restrictions.ilike("user2.firstname", firstname, MatchMode.ANYWHERE),
Restrictions.ilike("user2.lastname", lastname, MatchMode.ANYWHERE));
Criterion criterionUser3 = Restrictions.and(Restrictions.ilike("user3.firstname", firstname, MatchMode.ANYWHERE),
Restrictions.ilike("user3.lastname", lastname, MatchMode.ANYWHERE));
Criteria prodCriteria2 = session
.createCriteria(Prod.class)
.createAlias("userId1", "user1")
.createAlias("userId2", "user2")
.createAlias("userId3", "user3")
.add(Restrictions.or(criterionUser1, criterionUser2, criterionUser3));
推荐阅读
- spring-boot - 如何在 Thymeleaf、Springboot 中读取布尔数据类型中的自动选中单选按钮?
- c# - 如何在单个类属性中读取不同的 XML 元素?
- jenkins - Jenkins 中的主机密钥验证失败
- dialogflow-es - 是否可以在谷歌的操作中检查按钮是否被点击?
- android - 从firebase发送推送通知不起作用
- python - 如何在python中使用sql查询生成文本文件?
- c# - 无法使用 JsonUtility 反序列化数据
- winforms - 在主 UI 线程上更新控件的正确方法是什么
- testing - Windows 中 xammp 中的 Testlink 安装失败
- python - 使用 SODA API Python 从数据集中导入所有行