【问题标题】:JPA get MIN/MAX attribute of connected entityJPA获取连接实体的MIN / MAX属性
【发布时间】:2016-06-30 15:04:38
【问题描述】:

考虑以下两个实体:

@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 客户端中执行查询。

【问题讨论】:

    标签: java mysql database hibernate jpa


    【解决方案1】:

    您必须将本机 SQL 查询放入 @Formula 值中。当 Hibernate 查询此实体/属性时,它将用于创建选择查询。

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

    @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,它可以 - 但它会根据您的需要正常工作吗?)

    【讨论】:

    • 秘密是字符串中的大括号。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 2021-11-15
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2021-02-10
    • 1970-01-01
    相关资源
    最近更新 更多