有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA获取连接实体的最小/最大属性

考虑以下两个实体:

@Entity
public class HostMachine {
    @ManyToMany(fetch = FetchType.LAZY, targetEntity = Application.class)
    private Set<Application> applications;

    // getters and setters
}

@Entity
public class Application {
    @Basic
    @Enumerated(EnumType.STRING)
    private BusinessCriticality businessCriticality;

    @ManyToMany(fetch = FetchType.LAZY, targetEntity = HostMachine.class, mappedBy = "applications")
    private Set<HostMachine> hosts;

    // getters and setters
}

一种典型的ManytoMany关系现在我希望看到主机上已连接应用程序的最高业务关键性

我尝试使用@Transient属性,并在每个返回主机的查询之后设置它,但是对于集合,我需要对每个元素进行查询,因此这是非常没有性能且代码非常难看的

然后我尝试使用Hibernate的@Formula

@Formula("SELECT MIN(a.businessCriticality) FROM Application a")
private BusinessCriticality businessCriticality;

但这给了我一个MySQLSyntaxErrorException,即使我可以在MySQL客户机中执行查询


共 (1) 个答案

  1. # 1 楼答案

    您必须将本机SQL查询放入@Formula值中。然后,当对此实体/属性进行Hibernate查询时,它将用于创建select查询

    在您的情况下,应该是这样的(这取决于您使用的命名策略):

    @Formula("(select max(a.business_criticality) from application a " +
             "join host_machine_application hma on a.id = hma.application_id " +
             "where hma.host_machine_id = id)")"
    

    如果a.business_criticality可以放在max/min内,那么这一切都会起作用(对于MySQL来说,它是可以的,但它能正确地满足您的需要吗?)