次のようなJPAデータベースのセットアップがあります。
@Entity
public class Contact {
@Id
private Long id;
@Column(length = 64)
private String firstname;
@Column(length = 64)
private String surname;
@OneToMany(mappedBy = "contact")
private List<Address> adresses = new ArrayList<Address>();
@OneToMany(mappedBy = "contact")
private List<Telephone> telephones = new ArrayList<Telephone>();
}
@Entity
public class Address {
@Id
private Long id;
@Column(length = 128)
private String street;
@Column(length = 16)
private String plz;
@ManyToOne
private Contact contact;
}
@Entity
public class Telephone {
@Id
private Long id;
@Column(length = 32)
private String number;
@ManyToOne
private Contact contact;
}
これで、検索フォームに対して次のクエリが作成されました。
em.createQuery("SELECT DISTINCT c FROM Contact c LEFT JOIN c.addresses a LEFT JOIN c.telephones t "
+ "WHERE c.surnameLIKE '%"+var_surname+"%' "
+ "AND c.firstname LIKE '%"+var_firstname+"%' "
+ "AND a.street LIKE '%"+var_street+"%'"
+ "AND t.nummer LIKE '%"+var_telephone+"%'"
).getResultList();
私の質問は、3 つのテーブルすべてを 1 つの JPA クエリで結合して、名前、通り、番号などを検索するにはどうすればよいですか? すでに LEFT JOIN を試しましたが、たとえば Telephone テーブルが空の場合は結果が得られません (すべてのテーブルに適切なエントリがある場合は適切に機能します)。たとえば、連絡先に複数の電話番号がある場合でも、電話番号がなく、結果が 1 つしかない場合でも、連絡先の結果リストが必要です。
事前にご協力いただきありがとうございます。