@Override
public List find(FindUserRequestDto userRequestDto, Pageable pageable) {
Specification specification = buildSpecification(userRequestDto);
List users = repository.findAll(specification, pageable);
List userDtos = users.stream()
.map(userMapper::toResponseDto)
.toList();
return userDtos;
}
private static Specification buildSpecification(FindUserRequestDto userRequestDto) {
return (root, query, criteriaBuilder) -> {
var nameBeginsWith = criteriaBuilder.like(root.get("name"), userRequestDto.getName() + "%");
var bornAfter = criteriaBuilder.greaterThan(root.get("dateOfBirth"), userRequestDto.getDateOfBirth());
var hasEmail = criteriaBuilder.equal(root.join("emailData", JoinType.LEFT).get("email"), userRequestDto.getEmail());
var hasPhone = criteriaBuilder.equal(root.join("phoneData", JoinType.LEFT).get("phone"), userRequestDto.getPhone());
List predicates = new ArrayList();
if (userRequestDto.getName() != null) predicates.add(nameBeginsWith);
if (userRequestDto.getDateOfBirth() != null) predicates.add(bornAfter);
if (userRequestDto.getEmail() != null) predicates.add(hasEmail);
if (userRequestDto.getPhone() != null) predicates.add(hasPhone);
return criteriaBuilder.and(predicates.toArray(new jakarta.persistence.criteria.Predicate[0]));
};
}
< /code>
генерирует эти три запроса: < /p>
Hibernate:
select
u1_0.id,
u1_0.date_of_birth,
u1_0.name
from
"user" u1_0
left join
email_data ed1_0
on u1_0.id=ed1_0.user_id
left join
phone_data pd1_0
on u1_0.id=pd1_0.user_id
where
u1_0.name like ? escape ''
offset
? rows
fetch
first ? rows only
2025-05-31T18:54:41.186+03:00 TRACE 34688 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter (1:VARCHAR)
, даже если вы видите аннотации кэширования, это не вопрос кэширования (если кэширование как -то не связывается с объединениями). Если я выполняю его еще раз, последние два запроса не вызываются. Я предполагаю, что это означает кэширование. Тем не менее, это может присоединиться хотя бы что -то. Например, вместо: < /p>
select
u1_0.id,
u1_0.date_of_birth,
u1_0.name
< /code>
Это может выполнить этот выбор: < /p>
select
u1_0.id,
u1_0.date_of_birth,
u1_0.name,
pd1_0.user_id,
pd1_0.phone
this: < /p> [code] @Override public List find(FindUserRequestDto userRequestDto, Pageable pageable) { Specification specification = buildSpecification(userRequestDto); List users = repository.findAll(specification, pageable); List userDtos = users.stream() .map(userMapper::toResponseDto) .toList(); return userDtos; }
private static Specification buildSpecification(FindUserRequestDto userRequestDto) { return (root, query, criteriaBuilder) -> { var nameBeginsWith = criteriaBuilder.like(root.get("name"), userRequestDto.getName() + "%"); var bornAfter = criteriaBuilder.greaterThan(root.get("dateOfBirth"), userRequestDto.getDateOfBirth()); var hasEmail = criteriaBuilder.equal(root.join("emailData", JoinType.LEFT).get("email"), userRequestDto.getEmail()); var hasPhone = criteriaBuilder.equal(root.join("phoneData", JoinType.LEFT).get("phone"), userRequestDto.getPhone());
List predicates = new ArrayList(); if (userRequestDto.getName() != null) predicates.add(nameBeginsWith); if (userRequestDto.getDateOfBirth() != null) predicates.add(bornAfter); if (userRequestDto.getEmail() != null) predicates.add(hasEmail); if (userRequestDto.getPhone() != null) predicates.add(hasPhone); return criteriaBuilder.and(predicates.toArray(new jakarta.persistence.criteria.Predicate[0])); }; } < /code> генерирует эти три запроса: < /p> Hibernate: select u1_0.id, u1_0.date_of_birth, u1_0.name from "user" u1_0 left join email_data ed1_0 on u1_0.id=ed1_0.user_id left join phone_data pd1_0 on u1_0.id=pd1_0.user_id where u1_0.name like ? escape '' offset ? rows fetch first ? rows only 2025-05-31T18:54:41.186+03:00 TRACE 34688 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter (1:VARCHAR) , даже если вы видите аннотации кэширования, это не вопрос кэширования (если кэширование как -то не связывается с объединениями). Если я выполняю его еще раз, последние два запроса не вызываются. Я предполагаю, что это означает кэширование. Тем не менее, это может присоединиться хотя бы что -то. Например, вместо: < /p> select u1_0.id, u1_0.date_of_birth, u1_0.name < /code> Это может выполнить этот выбор: < /p> select u1_0.id, u1_0.date_of_birth, u1_0.name, pd1_0.user_id, pd1_0.phone [/code] Это уменьшит количество запросов на один.[code]repository.findById(id)[/code]), стремление избрать работает так же, как и ожидалось: одна из двух объектов @onetomany объединяется с пользователем , другой извлекается отдельно: [code]Hibernate: select u1_0.id, u1_0.date_of_birth, u1_0.name, ed1_0.user_id, ed1_0.email from "user" u1_0 left join email_data ed1_0 on u1_0.id=ed1_0.user_id where u1_0.id=? 2025-05-31T19:34:03.497+03:00 TRACE 23780 --- [nio-8080-exec-5] org.hibernate.orm.jdbc.bind : binding parameter (1:BIGINT)
Из — я использую первую рейтинговую систему с 10 полосками. Однако я хочу, чтобы по умолчанию вообще не было выбранной опции (т. е. не было полосок). Сейчас по умолчанию выбран вариант №1. Есть мысли? Я попробовал добавить пустую опцию, но все, что...
Я пишу прокси из Python Flask, используя библиотеку драматурга. У меня есть код, который работает, но я хотел бы сделать его быстрее. Вот что у меня есть:
@app.route('/fetch/')
def fetch_url():
url = request.args.get('url')
return fetch(url)
Я пишу прокси из Python Flask, используя библиотеку драматурга. У меня есть код, который работает, но я хотел бы сделать его быстрее. Вот что у меня есть:
@app.route('/fetch/')
def fetch_url():
url = request.args.get('url')
return fetch(url)