Spring Data JPA。如何仅通过子集合属性子集合结果进行过滤?

时间:2018-02-15 13:39:58

标签: java postgresql hibernate jpa spring-data-jpa

技术:

  • java8;
  • spring data jpa;
  • hibernate5;
  • 的PostgreSQL;

狭窄:

user_table{ id ... } calendar{ id ... } user_calendar_details ( id BIGSERIAL PRIMARY KEY, user_id NOT NULL, calendar_id NOT NULL, CONSTRAINT user_calendar_uk UNIQUE (user_id, calendar_id), user_id BIGINT REFERENCES user_table (id), calendar_id BIGINT REFERENCES calendar (id) ); CREATE TABLE calendar_details ( id BIGSERIAL PRIMARY KEY, user_calendar_details_id BIGSERIAL, CONSTRAINT user_calendar_det_uk UNIQUE (user_calendar_details_id), user_calendar_details_id BIGINT REFERENCES user_calendar_details (id) ... );

问题:

请求日历信息仅为请求数据的用户加载实体。 (user_id可以从安全上下文中获取) 对于每个calendar核心实体,只应加载一个映射表结果user_calendar_details和一个calendar_details

解决方法:

我打算在这里考虑下一个案例之一:

1变种

实现实体模型以在@OneToMany实体中使用Calendar映射,在内部集合中我们可以拥有UserCalendarDetails个实体集。如果加载(UserCalendarDetails)集合,则应对其进行过滤,并且只包含一个对象UserCalendarDetails(因为限制请参见上部user_calendar_uk)。在这种情况下,我需要在DB请求时间内以userId指定子集合过滤器的单独方式加载CalendarUserCalendarDetails两个db请求。

2变种

尝试使用hibernate继承 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = “user_id”) user_calendar_details和实体模型映射应为@OneToOneCalendaruser_calendar_details之间)。

3变种

使用联接中的限制的低级别数据库请求的一些想法。这似乎是解决我的问题(处理它)的最真实有效的方法。

问题:

问题1变种

我调查了这个想法,我的结论是不可能的,但我可能会弄错。我在stackoverflow上也检测到类似的想法,但没有正面答案。请确认我的结论或帮助解决此问题的想法(可能是示例)。

问题到2变种

我不清楚是否有可能。如果以const方式使用,我会使用@DiscriminatorValue(“myConcreteUserId”)。但它应该以动态的方式使用。我还没有想法,怎么做。有什么想法吗?

3个变种的问题

如何使用@OneToOne使用user_calendar_details映射以级联方式保存日历实体(请记住:在每个calendar的数据库中,我们可以在user_calendar_details中有几行,但是为用户加载应该每次只有一个)?

1 个答案:

答案 0 :(得分:0)

据我所知......数据模型如下: 1用户与用户日历详细信息有一对多的关系(这种关系是双向的,因此用户日历详细信息也与用户有多对一的关系)

2个用户日历详细信息与日历有多对一关系(此关系也可以是双向的,因此日历与用户日历详细信息有一对多的关系)

3个用户日历详细信息与日历详细信息有一对一的关系(我想您可能会考虑将它们合并到一个表中......但这取决于要求)

现在让我们以相同的方式设置域模型,用户日历详细信息将与日历和一对一关系具有一对一的关系。到日历细节....所以你只需要通过用户id(使用条件或查询或用I&#d; d构建的用户对象)加载用户日历详细信息,并且将急切地加载一对一的关系。默认(不是两个查询...只有一个),因此您将获得相关的日历和日历详细信息对象