Spring Boot JPA 使用查询填充实体字段

Mih*_*sek 6 java spring jpa spring-data-jpa spring-boot

我正在我的应用程序中构建一个菜单,因此我创建了实体 MenuItem,它代表我的菜单中的一项。这可以是文件或目录。

但是,我想知道一个目录是否有子目录,因为如果没有,我不想显示它。我也不希望对这么多的子项进行硬编码,因为这意味着我每次添加内容时都必须更新该值。

我想知道的是,是否有一种方法可以使用查询而不是持久值来映射属性。

这是我的 MenuItem.java 文件:

@Entity
@Table(name = "menu_item")
public class MenuItem {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column
    private long parent;

    @Column
    private String name;

    @Column
    private long num_of_childs;

    @Enumerated(EnumType.STRING)
    @Column
    private MenuItemType type;

    @ManyToOne
    @JoinColumn(name = "file_id")
    private FileItem file;

    /* getters and setters... */
}
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的:

@Column
@Transient
@Query("SELECT COUNT(i) as num_of_childs FROM MenuItem i WHERE parent = i.id")
private long num_of_childs;
Run Code Online (Sandbox Code Playgroud)

甚至可以做这样的事情吗?

Boy*_*yen 3

Hibernate 允许您使用@Formula 来做到这一点。

例子 :

@Formula("SELECT COUNT(i) FROM MenuItem i WHERE parent = i.id")
private long num_of_childs;
Run Code Online (Sandbox Code Playgroud)

但是,就您的情况而言,最好保留子菜单项的列表,因为无论如何您都需要在应用程序中使用它。