私のプロジェクトではJPA 2とHibernateが使用されており、2つのタイプの顧客を扱うための単一のテーブル継承設定があります。 Spring Data JPA仕様を使用して顧客のデータを照会しようとすると、私は常に不正確な結果を得ます。私は間違ったクエリを作成し、それを正しいものにする方法はまだ分かっていないからだと思います。ここでJPA 2単一テーブル継承に関する基準のクエリ(Hibernate)
は私のテストコードは(私は会社名で検索顧客をしようとしています)です:ログに
@Test
public void test() {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Customer> customerQuery = criteriaBuilder.createQuery(Customer.class);
Root<Customer> customerRoot = customerQuery.from(Customer.class);
Root<CompanyCustomer> companyCustomerRoot = customerQuery.from(CompanyCustomer.class);
CriteriaQuery<Customer> select = customerQuery.select(customerRoot);
select.where(criteriaBuilder.equal(companyCustomerRoot.get(CompanyCustomer_.companyName), "My Company Name"));
TypedQuery<Customer> query = entityManager.createQuery(select);
List<Customer> results = query.getResultList();
assertEquals(1, results.size()); // always got size 2
}
SQLスクリプト:
:Hibernate:
select
customer0_.id as id2_16_,
customer0_.type as type1_16_,
customer0_.first_name as first_na8_16_,
customer0_.last_name as last_nam9_16_,
customer0_.company_name as company13_16_
from
customers customer0_ cross
join
customers companycus1_
where
companycus1_.type='COMPANY'
and companycus1_.company_name=?
私のデータベースに2つのレコードがあります。
insert into customers (id, type, company_name) values (1, 'COMPANY', 'My Company Name');
insert into customers (id, type, first_name, last_name) values (2, 'PERSONAL', 'My First Name', 'My Last Name');
マイ単一テーブル継承の設定:(代わりにCriteriaQuery.fromを使用しての 利用CriteriaBuilder.treat()意気消沈Customerエンティティへ:
@Entity
@Table(name = "customers")
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public abstract class Customer {
@Enumerated(EnumType.STRING)
@Column(name = "type", insertable = false, updatable = false)
private CustomerType type;
private String contactNumber;
}
@Entity
@DiscriminatorValue("PERSONAL")
public class PersonalCustomer extends Customer {
private String firstName;
private String lastName;
}
@Entity
@DiscriminatorValue("COMPANY")
public class CompanyCustomer extends Customer {
private String companyName;
}
public enum CustomerType {
COMPANY, PERSONAL;
}
hibernateによって生成されたSQLにクロスジョインがあることから、2行が返されます。データベースから取得したいものを説明してください。 –
@SangramJadhav私は会社名で顧客を検索しようとしています。実際には私は検索機能に取り組んでおり、テストコードはユースケースの1つです。ユーザーは姓または名でも検索できます。 – user1831877
会社と人を検索するには、2つの異なる方法が必要です。そうすれば、会社名または顧客名のみで照会することができます。あなたのサービス層は、CustomerTypeに応じてどのメソッドを呼び出すかを決めることができます。 –