Spring specifications - subclasses in joins

885 Views Asked by At

Let's say I have entities:

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

I use Sprint Data JPA Specifications. I have a list of street's ids and I want to search for Persons that contain adressess with streets that ids are on that list.

Those are solutions that didn't work for me.

@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);
}

Causes: 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);
}

Causes: Invalid path: 'generatedAlias2.id' [select generatedAlias0 from PersonEntity as generatedAlias0 inner join generatedAlias0.address as generatedAlias1 where ( generatedAlias2.id in:param0 )

When I move address from DetailedAddressEntity to AddressEntity all works fine.

0

There are 0 best solutions below