Java 来自JPA联接的有效派生计数
我有一个Spring Boot应用程序,使用Java 来自JPA联接的有效派生计数,java,hibernate,spring-boot,jpa,Java,Hibernate,Spring Boot,Jpa,我有一个Spring Boot应用程序,使用JpaRepository访问我的数据 我遇到了一个问题,那就是如何在一个单一的场景中找到最优雅、最高效的属性聚合解决方案 我有以下场景: public class Item { @Id private int Id; /* @OneToMany(mappedBy = "item") @JsonIgnore private List<LoggedItem> loggedItems
JpaRepository
访问我的数据
我遇到了一个问题,那就是如何在一个单一的场景中找到最优雅、最高效的属性聚合解决方案
我有以下场景:
public class Item {
@Id
private int Id;
/*
@OneToMany(mappedBy = "item")
@JsonIgnore
private List<LoggedItem> loggedItems
@JsonProperty("instances")
public int instances() {
return loggedItems.size();
}
@JsonProperty("lastRun")
public LocalDateTime lastRun() {
return loggedItems.stream().
.map(LoggedItem::getExecutedAt)
.max(LocalDateTime::compareTo)).orElse(null);
}
*/
}
我尝试不使用派生列,而是依赖于列表,但是我得到了重复的行。是的,添加distinct关键字可以消除这些问题,但它仍然显得效率很低
我还探讨了使用不同的@Fetch
模式和@JsonManagedReference/@JsonBackReference(尽管这些只是为了防止序列化时出现无限递归)
有人能推荐最合适的方法吗?您希望在这里实现什么?你说的派生计数是什么意思?为什么不创建一个DTO并创建一个查询来计算计数和最大日期?@MushifAliNawaz,我正在尝试实现我在我的项目中注释掉的属性class@SimonMartinelli我认为这听起来很合理。我在哪里计算?在mapper?中,让查询返回最大执行时间。您可以使用自定义
@Query
在存储库中编写方法。
public class LoggedItem {
@Id
private int Id;
LocalDateTime executedAt;
@ManyToOne
@JoinColumn(name = ""item_id", referencedColumnName = "id")
private Item item;
}