Я не опубликовал код из-за проблем с конфиденциальностью, но в значительной степени у меня есть два объекта в отношениях один к одному (это может быть много к одному, но для этого случая я не думаю, что это имеет большое значение), например:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
//...
}
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String subject;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn
private User otherUser;
//...
}
The repository looks like this
@EntityGraph(attributePaths = {"otherUser"})
Iterable<Post> findAll(Predicate predicate);
Поэтому я переопределил метод findAll, который они предоставляют по умолчанию, потому что я все еще хочу использовать предикат и все еще хочу присоединить запрос к другой таблице.Это почти идеально работает.Созданный запрос выглядит следующим образом:
select
post0_.id as id1_4_0_,
user0_.id as id1_0_1_,
post0_.subject as subject2_4_0_,
user0_.name as name2_0_1_,
user0_.email as email3_0_1_
from
Post post0_
left outer join User user0_ on post0_.id = user0_.id
where
***contents of Predicate****
Теперь проблема в том, что если пользователь возвращается в основном со значением NULL (все атрибуты пользователя имеют значение NULL, то есть один не существует, чтобы соответствовать условию) из этого запроса, тоSpring создает дополнительные запросы выбора непосредственно к таблице User, ища пользователя.Например, скажем, есть запись с id = 4.Если нет пользователя с id = 4, то Spring создаст и выполнит обычный запрос, подобный следующему:
select
user0_.id as id1_0_1_,
user0_.name as name2_0_1_,
user0_.email as email3_0_1_
from
User user0_
left outer join User user0_ on post0_.id = user0_.id
where
user0_id = 4
Это проблема, если набор данных большой и содержит большое количество записей, которые не соответствуютисходный запрос соединения, тогда будет создано и выполнено слишком много дополнительных запросов.Если это не соответствует критериям объединения, я бы хотел, чтобы эта запись сущности игнорировалась.Используя этот пример, я бы хотел, чтобы любой пользователь, идентификатор которого не совпадает с идентификатором поста, игнорировался, а не другой оператор выбора.Есть ли способ предотвратить создание этих дополнительных запросов на выборку?