В моем Springbot я использую Hibernate в качестве структуры сущностей. Там у меня есть сущность, которая имеет отношение @OneToMany
:
@Entity
@Table(schema = SCHEMA_NAME, name = "PROJECT")
@Immutable
public class ProjectEntity {
@Id
@Column(name = ID_COLUMN)
private Integer id;
@OneToMany(mappedBy = "project")
private Set<ProjectPartEntity> projectParts = new HashSet<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Set<ProjectPartEntity> getProjectParts() {
return projectParts;
}
public void setProjectParts(Set<ProjectPartEntity> projectParts) {
this.projectParts = projectParts;
}
}
Я хочу иметь свойство для сущности, которое возвращает логическое значение, независимо от того, есть ли у Project ProjectParts или нет:
ProjectEntity project = new ProjectEntity();
project.hasProjectParts();
Я не хочу чтобы проверить, является ли projectParts
Set пустым, потому что он вызовет ленивую выборку всех projectParts
Я нашел аннотацию @Formula в Hibernate полезной для этого, поэтому я добавил новое свойство в ProjectEntity:
@Formula("(SELECT (COUNT(*) > 0) THEN true ELSE false end FROM PROJECT_PARTS as p WHERE p.project_id = id)")
private Boolean hasPartListDefinitions;
И это прекрасно работает, каждый раз, когда ProjectEntity
выбирается, эта формула будет выполняться как Subquery
и присваивать результат свойству объекта.
Что мне не нравится, так это то, что вы можете писать только Native
запрос для Formula
. Есть ли способ использовать по крайней мере JPQL
с Formula
или что-то еще, что на самом деле typed
на самом деле.
Спасибо в дополнение.