2015-04-20 3 views
1

У меня есть эта спецификация:Литье в спецификации JPA

public static Specification<CompensationCase> containsClaimantName(final String firstName, final String middleName, final String surName, final String motherMaidenName) { 
    return new Specification<CompensationCase>() { 
     public Predicate toPredicate(Root<CompensationCase> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
      Path<Claimant> claimantPath = root.get(CompensationCase_.claimant); 

      Subquery<ClaimantPerson> claimantPersonSubquery = query.subquery(ClaimantPerson.class); 
      Root<ClaimantPerson> claimantPersonRoot = claimantPersonSubquery.from(ClaimantPerson.class); 

      claimantPersonSubquery. 
        select(claimantPersonRoot). 
        where(
          ClaimantPersonSpecs 
            .containsPersonName(firstName, middleName, surName, motherMaidenName) 
            .toPredicate(claimantPersonRoot, query, cb)); 

      return cb.in(claimantPath.as(ClaimantPerson.class)).value(claimantPersonSubquery); 
     } 
    }; 
} 

ClaimantPerson Где унаследован от Claimant. Я читал, что вы можете использовать с помощью .as(), но я не уверен, что я делаю это правильно. В настоящее время я получаю эту ошибку:

--Erroring: batchId[2] message[java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '.' near line 1, column 137 [select generatedAlias0 from test.project.compensation.model.CompensationCase as generatedAlias0 where cast(generatedAlias0.claimant as test.project.compensation.model.ClaimantPerson) in (select generatedAlias1 from test.project.compensation.model.ClaimantPerson as generatedAlias1 where generatedAlias1.personRef in (select generatedAlias2 from test.project.entity.identity.PersonRef as generatedAlias2 where (((lower(generatedAlias2.name.firstName) like :param0) and (1=1)) and (lower(generatedAlias2.name.surname) like :param1)) and (lower(generatedAlias2.name.motherMaidenName) like :param2)))]] 

(обратите внимание, что столбец 137 относится к test.project.compensation.model.ClaimantPerson)

Я уверен, что есть что-то делать с литьем. Как я могу ссылаться на ClaimantPerson, когда у меня есть свойство Claimant под номером CompensationCase?

Вот фрагменты определений классов/сущностей:

CompensationCase класс я запрашивая

@Entity 
@Table(name = "project_compensation_case") 
@EntityListeners({CompensationCaseNumberListener.class}) 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class CompensationCase extends AutoIdBasedEntity{ 

    @Valid 
    @NotNull(message = "{compensationCase.claimant.NotNull}") 
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false) 
    @ForeignKey(name = "FK_CompensationCase_Claimant") 
    @JoinColumn(name = "claimant_id", unique = true, updatable = false, nullable = false) 
    private Claimant claimant; 
    //So on.... 
} 

Это заявитель:

@Entity 
@Table(name = "project_compensation_claimant") 
@Inheritance(strategy = InheritanceType.JOINED) 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "objectType") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(ClaimantPerson.class), 
    @JsonSubTypes.Type(ClaimantOrganization.class) 
}) 
public abstract class Claimant extends AutoIdBasedEntity{ 
    //stuff here 
} 

Это claimantPerson:

@Entity 
@Table(name = "project_compensation_claimant_person") 
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "objectType") 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class ClaimantPerson extends Claimant { 
    //properties and stuff 
} 

Цените любую помощь. Благодаря!

ответ

0

Оказывается, мне не нужен метод .as(). Выполняя подзапрос, я мог бы сделать псевдо-литье.

Так в основном последняя строка на моей спецификации становится:

return cb.in(claimantPath).value(claimantPersonSubquery); 

Ответ на этот вопрос помог направить мне правильный путь: Polymorphic JPA query with CriteriaQuery API

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