|
When Hibernate transforms an HQL with joins from an Entity to another entity that inherits from a third entity all of them with filters, the SQL sentence puts a reference from a later join.
Example:
If we've got 3 classes: Animal, Dog and Owner. Dog is an Animal and one Dog has only one Owner and viceversa. A Dog has to have an Owner, but we can have an Owner without a Dog.
All querys must be filtered by a company id.
We've got this classes:
@Entity @Table(name = "animals") @Inheritance(strategy = InheritanceType.JOINED) @FilterDef(name = "companyFilter", parameters = @ParamDef(name = "companyIdParam", type = "java.lang.Long")) @Filters(@Filter(name = "companyFilter", condition = "id_company = :companyIdParam")) public class Animal
Unknown macro: { private int id; private String name; private long company; ... }
@Entity @Table(name = "dogs") @PrimaryKeyJoinColumn(name = "id_dog", referencedColumnName = "id_animal") public class Dog extends Animal
Unknown macro: { private String breed; private Owner owner; ... }
@Entity @Table(name = "owners") @Inheritance(strategy = InheritanceType.JOINED) @FilterDef(name = "companyFilter", parameters = @ParamDef(name = "companyIdParam", type = "java.lang.Long")) @Filters(@Filter(name = "companyFilter", condition = "id_company = :companyIdParam")) public class Owner
Unknown macro: { private int id; private String name; private Dog dog; private long company; ... }
This HQL Query:
"SELECT o FROM Owner o " + "INNER JOIN FETCH o.dog d " + "WHERE o.id = :id"
Is translated to:
select * from owners owner0_ inner join dogs dog1_ on owner0_.id_owner=dog1_.id_owner and dog1_1_.id_company = 1 inner join animals dog1_1_ on dog1_.id_dog=dog1_1_.id_animal where owner0_.id_company = 1 and owner0_.id_owner=1
The SQL is wrong, in the on clause of dog, it makes a reference to animal, that is joined later. So this query never works.
|