 <p>Okay, with the help of Syfors' suggestions i have change the relationship between A and B:</p> <pre><code>class Aa implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String value; } @Entity class A implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @JoinColumn(nullable = false) @OneToOne private Aa aa; @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, mappedBy = "owner") private List&lt;B&gt; data; } @Entity class B implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @OneToOne private A owner; private String value; } </code></pre> <p>I have also found:</p> <blockquote> <p>[...]Normally it is best to define the ManyToOne back reference in Java[...]</p> </blockquote> <p>Source: <a href="http://en.wikibooks.org/wiki/Java_Persistence/OneToMany" rel="nofollow">http://en.wikibooks.org/wiki/Java_Persistence/OneToMany</a></p> <p>Now JPA doesn't generate a thrid table for the m:1 relationship and now my JPQL query works fine:</p> <pre><code>DELETE FROM B b WHERE b.id IN(SELECT k.id FROM A a JOIN a.data k WHERE a.id = :id) </code></pre>