Spring规范 - 连接中的子类

时间:2017-01-04 13:18:50

标签: spring hibernate spring-data-jpa specifications

假设我有实体:

@Entity
public abstract class Person{
    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
    @JoinColumn(name = "ADDRESS_ID", referencedColumnName = "ID")
    private AddressEntity address;
}

@Entity 
@DiscriminatorColumn(name = "TYPE")
public abstract class AddressEntity{
//some attributes
}

@Entity
@DiscriminatorValue(value = "DETAILED")
public class DetailedAddressEntity extends AddressEntity {
    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
    @JoinColumn(name = "STREET_ID", referencedColumnName = "ID")
    private StreetEntity street;
}

@Entity
public class StreetEntity {
    @Id
    @Column(name = "ID")
    private long id;
}

我使用Sprint Data JPA规范。我有一个街道ID的列表,我想搜索包含adressess的人员,其中包含ID列表中的ID。

这些解决方案对我不起作用。

@Override
public Predicate toPredicate(Root<PersonEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
    Join<PersonEntity, DetailedAddressEntity> join = root.join("address");
    Join<DetailedAddressEntity, StreetEntity> join1 = join.join("street");
    return join1.get(StreetEntity_.id).in(paramValue);
}

原因:Unable to locate Attribute with the the given name [street] on this ManagedType [AddressEntity].

@Override
public Predicate toPredicate(Root<PersonEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

    Path<Object> path = criteriaBuilder.treat(this.joinList(root, PersonEntity_.address, JoinType.LEFT), DetailedAddressEntity.class).join(DetailedAddressEntity_.street).get(StreetEntity_.id.getName());

    return path.in(paramValue);
}

@Override public Predicate toPredicate(Root<PersonEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { Path<Object> path = criteriaBuilder.treat(this.joinList(root, PersonEntity_.address, JoinType.LEFT), DetailedAddressEntity.class).join(DetailedAddressEntity_.street).get(StreetEntity_.id.getName()); return path.in(paramValue); } 原因:

当我将地址从Invalid path: 'generatedAlias2.id' [select generatedAlias0 from PersonEntity as generatedAlias0 inner join generatedAlias0.address as generatedAlias1 where ( generatedAlias2.id in:param0 )移至DetailedAddressEntity时,一切正常。

0 个答案:

没有答案