我有以下查询和方法
private static final String FIND = "SELECT DISTINCT domain FROM Domain domain LEFT OUTER JOIN FETCH domain.operators LEFT OUTER JOIN FETCH domain.networkCodes WHERE domain.domainId = :domainId"; @Override public Domain find(Long domainId) { Query query = getCurrentSession().createQuery(FIND); query.setLong("domainId", domainId); return (Domain) query.uniqueResult(); }
与Domain作为
Domain
@Entity @Table public class Domain { @Id @GenericGenerator(name = "generator", strategy = "increment") @GeneratedValue(generator = "generator") @Column(name = "domain_id") private Long domainId; @Column(nullable = false, unique = true) @NotNull private String name; @Column(nullable = false) @NotNull @Enumerated(EnumType.STRING) private DomainType type; @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER) @JoinTable(joinColumns = { @JoinColumn(name = "domain_id") }, inverseJoinColumns = { @JoinColumn(name = "code") }) @NotEmpty @Valid // needed to recur because we specify network codes when creating the domain private Set<NetworkCode> networkCodes = new HashSet<>(); @ManyToMany(fetch = FetchType.EAGER) @JoinTable(joinColumns = { @JoinColumn(name = "parent", referencedColumnName = "domain_id") }, inverseJoinColumns = { @JoinColumn(name = "child", referencedColumnName = "domain_id") }) private Set<Domain> operators = new HashSet<>(); // more }
我希望这个查询可以获取Set<NetworkCode>and Set<Domain>关系,但事实并非如此。假设DomainI查询有两个运算符,Hibernate将执行1 + 2 * 2 = 5个查询
Set<NetworkCode>
Set<Domain
Hibernate: select distinct domain0_.domain_id as domain1_1_0_, domain2_.domain_id as domain1_1_1_, networkcod4_.code as code2_2_, domain0_.name as name1_0_, domain0_.type as type1_0_, domain2_.name as name1_1_, domain2_.type as type1_1_, operators1_.parent as parent1_0__, operators1_.child as child4_0__, networkcod3_.domain_id as domain1_1_1__, networkcod3_.code as code5_1__ from domain domain0_ left outer join domain_operators operators1_ on domain0_.domain_id=operators1_.parent left outer join domain domain2_ on operators1_.child=domain2_.domain_id inner join domain_network_codes networkcod3_ on domain0_.domain_id=networkcod3_.domain_id inner join network_code networkcod4_ on networkcod3_.code=networkcod4_.code where domain0_.domain_id=? Hibernate: select operators0_.parent as parent1_1_, operators0_.child as child4_1_, domain1_.domain_id as domain1_1_0_, domain1_.name as name1_0_, domain1_.type as type1_0_ from domain_operators operators0_ inner join domain domain1_ on operators0_.child=domain1_.domain_id where operators0_.parent=? Hibernate: select networkcod0_.domain_id as domain1_1_1_, networkcod0_.code as code5_1_, networkcod1_.code as code2_0_ from domain_network_codes networkcod0_ inner join network_code networkcod1_ on networkcod0_.code=networkcod1_.code where networkcod0_.domain_id=? Hibernate: select operators0_.parent as parent1_1_, operators0_.child as child4_1_, domain1_.domain_id as domain1_1_0_, domain1_.name as name1_0_, domain1_.type as type1_0_ from domain_operators operators0_ inner join domain domain1_ on operators0_.child=domain1_.domain_id where operators0_.parent=? Hibernate: select networkcod0_.domain_id as domain1_1_1_, networkcod0_.code as code5_1_, networkcod1_.code as code2_0_ from domain_network_codes networkcod0_ inner join network_code networkcod1_ on networkcod0_.code=networkcod1_.code where networkcod0_.domain_id=?
我猜这是因为我加入了operator Domain元素,但他们必须加入自己的行列。
我可以执行同时执行的HQL查询吗?
如果您知道树中只有两个级别,那么您是否考虑过加入更深的一个级别。像下面的东西?
SELECT DISTINCT domain FROM Domain domain LEFT OUTER JOIN FETCH domain.operators operators1 LEFT OUTER JOIN FETCH domain.networkCodes LEFT OUTER JOIN FETCH operators1.operators operators2 LEFT OUTER JOIN FETCH operators1.networkCodes WHERE domain.domainId = :domainId