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

时间:2018-02-21 13:15:26

标签: java spring jpa spring-boot spring-data-jpa

我正在我的应用程序中构建一个菜单,所以我创建了实体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... */
}

我想要的是这样的:

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

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

3 个答案:

答案 0 :(得分:1)

您可以为该实体创建存储库,并使用JPA计算所有出现次数

@Repository
public interface MenuItemRepository extends JpaRepository<MenuItem, Long> {

    public int countByParent(long parent);

} 

不只是使用JPA-Method

答案 1 :(得分:0)

Hibernate允许您使用@Formula执行此操作。

示例:

from django.db.models import OuterRef, Subquery

com = Comment.objects.filter(commentSub=OuterRef('pk')).order_by('-created_at')
myList = queryset.annotate(LastComment=Subquery(com.values('commentText')[:1]))
myList = myList.values_list('UserName', 'UserCountry', 'LastComment')

但是,在您的情况下,最好保留一个子菜单项列表,因为您仍然需要在您的应用程序中使用它。

答案 2 :(得分:0)

您可以在存储库中创建计数方法

 @Repository
 interface MenuItemRepository extends JpaRepository<MenuItem, Long> {

    long countByParent(String lastname);
 }