Извините, если моя терминология неверна.
Мы используем данные весны, JpaRepositories и критериальные запросы в качестве нашего метода для запроса данных из нашей базы данных.
У меня есть проблема, когда я объединяю две спецификации, такие как hasTimeZone и hasCity в hasCityAndTimeZone в приведенном ниже примере кода, он дважды выполняет соединение с одной и той же таблицей, поэтому приведенный ниже запрос будет выглядеть примерно так:
select * from Staff, Location, Location
Есть ли способ, чтобы две спецификации использовали одно и то же соединение вместо того, чтобы каждая из них определяла свое собственное соединение, которое по сути одно и то же?
Извините, код, вероятно, неполный, я просто пытался показать быстрый пример.
class Staff {
private Integer id;
private Location location;
}
class Location {
private Integer id;
private Integer timeZone;
private Integer city;
}
class StaffSpecs {
public static Specification<Staff> hasTimeZone(Integer timeZone) {
return new Specification<Staff>() {
@Override
public Predicate toPredicate(Root<Staff> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Path<Integer> timeZonePath = root.join(Staff_.location).get(Location_.timeZone);
return cb.equal(timeZonePath, timeZone);
}
}
}
public static Specification<Staff> hasCity(Integer city) {
return new Specification<Staff>() {
@Override
public Predicate toPredicate(Root<Staff> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Path<Integer> cityPath = root.join(Staff_.location).get(Location_.city);
return cb.equal(cityPath, city);
}
}
}
public static Specification<Staff> hasCityAndTimeZone(Integer city, Integer timeZone) {
return where(hasCity(city)).and(hasTimeZone(timeZone));
}
}