我正在我的应用程序中构建一个菜单,所以我创建了实体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;
甚至可以做这样的事情吗?
答案 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);
}