Hibernate Core {5.0.12.Final}
JPQL implicit join causes Hibernate generate "CROSS JOIN" instead of "INNER JOIN" for joining tables with one-to-one relationship.
Looks like another old similar issue https://hibernate.atlassian.net/browse/HHH-7707.
h5. Entities {code:java} import lombok.Data;
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne;
@Entity @Data public class Person {
@Id private Long id; private String firstname; private String lastname;
@OneToOne @JoinColumn(name = "id") private StreetAddress streetAddress; } {code} {code:java} import lombok.Data;
import javax.persistence.Entity; import javax.persistence.Id;
@Entity @Data public class StreetAddress {
@Id private Long personId; private String address; } {code} h5. Implicit Join (generates Cross Join) ΒΆ
{code:sql} select p from Person p where p.streetAddress.address = ?1 {code}
{code} Hibernate: /* select p from Person p where p.streetAddress.address = ?1 */ select person0_.id as id1_0_, person0_.firstname as firstnam2_0_, person0_.lastname as lastname3_0_ from person person0_ cross join street_address streetaddr1_ where person0_.id=streetaddr1_.person_id and streetaddr1_.address=? {code}
h5. Explicit Join (generates Inner Join)
{code:sql} select p from Person p join p.streetAddress a where a.address = ?1 {code}
{code} Hibernate: /* select p from Person p join p.streetAddress a where a.address = ?1 */ select person0_.id as id1_0_, person0_.firstname as firstnam2_0_, person0_.lastname as lastname3_0_ from person person0_ inner join street_address streetaddr1_ on person0_.id=streetaddr1_.person_id where streetaddr1_.address=? {code}
Full source code available on [github|https://github.com/ilya-bystrov/ilya-bystrov.github.io-src/tree/master/hibernate_jpql_cross_join_bug]. The same description can be found on my [blog|https://ilya-bystrov.github.io/posts/hibernate-jpql-cross-join-bug/] |
|