Spring Data JPA выполняет дополнительные запросы выбора при использовании графа сущностей - PullRequest
0 голосов
/ 15 марта 2019

Я не опубликовал код из-за проблем с конфиденциальностью, но в значительной степени у меня есть два объекта в отношениях один к одному (это может быть много к одному, но для этого случая я не думаю, что это имеет большое значение), например:

@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

Это проблема, если набор данных большой и содержит большое количество записей, которые не соответствуютисходный запрос соединения, тогда будет создано и выполнено слишком много дополнительных запросов.Если это не соответствует критериям объединения, я бы хотел, чтобы эта запись сущности игнорировалась.Используя этот пример, я бы хотел, чтобы любой пользователь, идентификатор которого не совпадает с идентификатором поста, игнорировался, а не другой оператор выбора.Есть ли способ предотвратить создание этих дополнительных запросов на выборку?

...