假设我有实体:
@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
时,一切正常。