2016-06-01 2 views
0

В моем проекте используется JPA 2 с Hibernate, и существует единая таблица наследования для работы с двумя типами клиентов. Когда я пытаюсь запросить данные о клиентах с помощью спецификации Spring Data JPA, я всегда получаю неправильный результат. Я думаю, это потому, что я неправильно создаю запрос и до сих пор не знаю, как правильно это сделать.JPA 2 Критерии запроса на одноуровневое наследование (спящий режим)

Вот мой тестовый код (я пытаюсь поиска клиента по имени компании):

@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=? 

Есть две записи в моей базе данных:

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');

Мой один установ таблица наследования:

@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; 
} 
+0

Он вернет 2 строки, так как вы можете увидеть, что в SQL создается спящий режим, созданный спящим режимом. Пожалуйста, вы можете объяснить, что вы хотите получить из базы данных –

+0

@SangramJadhav Я пытаюсь найти клиента по названию компании. На самом деле я работаю над функцией поиска, а тестовый код является одним из вариантов использования. Пользователь сможет выполнять поиск по имени или фамилии. – user1831877

+0

Вам нужны два разных метода поиска компании и человека. Таким образом, вы можете запрашивать только имя компании или имя клиента. Ваш уровень обслуживания может решить, какой метод вызывать в зависимости от CustomerType –

ответ

Смежные вопросы