我将场景作为一个主要实体和另一个辅助实体。主要实体使用OneToMany关系从辅助实体获取记录。但是我只需要使用created_timestamp从辅助实体获取最新的3条记录。如何才能实现此方案使用Spring Boot / Spring Data JPA。本场景中使用的数据库是Postgres。 请建议。
答案 0 :(得分:0)
如何实现这一目标有多种选择。哪一个适合你,取决于你想要做什么。
如果你只想要最后三个元素,因为你想要使用它们,但你不关心其他元素是否被加载,你可以简单地创建另一个属性来分发过滤集合。只需确保JPA不会映射该属性。
我想更像是你实际上不想加载其他实体的情况,因为它可能是大量的实体。
问题是JPQL不支持LIMIT子句,但在查询对象上只有setMaxResults
方法。这意味着您可以将其应用于子选择或类似。这再次意味着您必须使用SQL来进行限制。
有了这个,你又有了多个选择:
回到根:只需编写一个SQL语句,为您提供所需的结果。使用JdbcTemplate
执行此操作并提供合适的(最有可能是手工制作的)RowMapper
或ResultSetExtractor
。当然,生成的实体将被分离,尝试将它们重新附加到JPA会话是一个坏主意。
使用视图:为辅助实体创建一个视图,该视图将每个主要实体的行限制为三个。将实体类映射到该视图。请注意,实体将附加到JPA会话,但您不能修改它们,因为写入视图将很可能根本不起作用,如果它们这样做将无法根据需要使用JPA,因为数据库将有效地更改集合内容,JPA需要重新选择所有数据以获得一致的状态。
无论哪种方式,您都必须在SQL中编写查询。为此,您需要LIMIT clause并可能将其应用于联接中的内嵌视图。