2016-03-15 49 views
-1

的MIN/MAX属性考虑以下两个实体: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

您必须在@Formula值内放置原生SQL查询。当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也可以是 - 但它会为你的需求正常工作吗?)

+0

秘密是在字符串内的大括号。谢谢! –