实现 SQL 查询作为两个多对一关系的 JPA 条件
Implementing SQL query as JPA Criteria for two Many-To-One relationships
我正在尝试为以下场景构建 JPA 标准。我有以下 3 个实体 class,其中两个与 UniqueType 有 @ManyToOne 关系,但 UniqueType 与任何其他 class 没有明确关系:
结构如下:
------------- ----------- ------------
event N:1 unique_type 1:N detail
------------- ----------- ------------
event_id (PK) type_code (PK) detail_id (PK)
type_code (FK) type_code (FK)
abbreviation
SQL查询成功选择了按缩写筛选的事件记录:
SELECT
event.event_id,
event.type_code,
detail.abbreviation
FROM
event
JOIN unique_type ON event.type_code = unique_type.type_code
JOIN detail ON detail.type_code = unique_type.type_code
WHERE detail.abbreviation = 'ABC'
我将事件 class 作为我的根,但是当我加入 UniqueType class 时,我卡住了,因为与 UniqueType
上的 Detail 没有明确的关系
Join<Event, UniqueType> joinToUniqueType = root.join(Event_.typeCode);
Join<UniqueType, ???>
我希望能够搜索类似这样的缩写:
predicates.add(builder.lower(joinToDetail.get(Detail_.abbreviation)),'ABC');
条件怎么写?非常感谢任何帮助。
由于您需要内部连接语义,您可以使用交叉连接代替,数据库无论如何都会对其进行优化。使用以下
Root<Detail> event = query.from(Event.class);
Root<Detail> detail = query.from(Detail.class);
predicates.add(builder.eq(detail.get(Detail_.typeCode), event.get(Event_.typeCode));
predicates.add(builder.lower(detail.get(Detail_.abbreviation)),'ABC');
我正在尝试为以下场景构建 JPA 标准。我有以下 3 个实体 class,其中两个与 UniqueType 有 @ManyToOne 关系,但 UniqueType 与任何其他 class 没有明确关系: 结构如下:
------------- ----------- ------------
event N:1 unique_type 1:N detail
------------- ----------- ------------
event_id (PK) type_code (PK) detail_id (PK)
type_code (FK) type_code (FK)
abbreviation
SQL查询成功选择了按缩写筛选的事件记录:
SELECT
event.event_id,
event.type_code,
detail.abbreviation
FROM
event
JOIN unique_type ON event.type_code = unique_type.type_code
JOIN detail ON detail.type_code = unique_type.type_code
WHERE detail.abbreviation = 'ABC'
我将事件 class 作为我的根,但是当我加入 UniqueType class 时,我卡住了,因为与 UniqueType
上的 Detail 没有明确的关系Join<Event, UniqueType> joinToUniqueType = root.join(Event_.typeCode);
Join<UniqueType, ???>
我希望能够搜索类似这样的缩写:
predicates.add(builder.lower(joinToDetail.get(Detail_.abbreviation)),'ABC');
条件怎么写?非常感谢任何帮助。
由于您需要内部连接语义,您可以使用交叉连接代替,数据库无论如何都会对其进行优化。使用以下
Root<Detail> event = query.from(Event.class);
Root<Detail> detail = query.from(Detail.class);
predicates.add(builder.eq(detail.get(Detail_.typeCode), event.get(Event_.typeCode));
predicates.add(builder.lower(detail.get(Detail_.abbreviation)),'ABC');