@Entity
@Getter
@Setter
public class TaskManagement {
private Long id;
private String title;
//Some other attributes
}
@Entity
@Getter
@Setter
public class Tagging {
private Long id;
private String name;
private String taskManagementId;
//Some other attributes
}
public class TaskManagementSpecification implements Specification<TaskManagement> {
private final TaskManagementSearchDto taskManagementSearchDto;
@Override
public Predicate toPredicate(Root<TaskManagement> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> andClause = new ArrayList<>();
//To Cross join TaskManagement to Tagging that they are unrelated
if (!CollectionUtils.isEmpty(taskManagementSearchDto.getTagIds())) {
Root<Tagging> taggingRoot = criteriaQuery.from(Tagging.class);
andClause.add(criteriaBuilder.equal(taggingRoot.get("taskManagementId"), root.get(TaskManagement_.ID)));
}
}
}
型 结果查询为:
select foo
from task_management taskmanage0_
cross join tagging tagging1_
where tagging1_.task_mangement_id = taskmanage0_.id
6条答案
按热度按时间v64noz0r1#
这实际上是可能的,具有以下标准:
字符串
更新:这实际上是执行子查询而不是连接,但它允许您在两个没有定义hibernate关系的实体上使用Criteria。
r8xiu3jd2#
我的理解是,如果你使用HQL做这件事,你是在创建一个带有过滤器的笛卡尔连接,而不是一个内部连接。条件查询不支持这样做。
r9f1avp53#
在NHibernate中,您可以使用定义为DetachedCriteria的子查询。不确定它在Java中的工作方式是否相同,但很可能是相同的:
字符串
假设它是使用拥有者的名称来链接。
fhity93d4#
字符串
gcuhipw95#
此时,这可以通过以下方式实现:
Spring data JPA 2.1.10我有两个实体:
字符串
任务可以有一些标记。但是TaskManagement和Tag实体之间没有任何关系。
为了搜索taskmanagements,我使用了TaskManagementSpecification,如下所示:
型
结果查询为:
型
bxfogqkk6#
有一个
SQLCriterion
,你可以给予任意的SQL
,并添加到你的Criteria
。在SQL
字符串中,标记“{alias}”将替换为根实体的别名。