← Назад к вопросам
Как сделать вывод данных с определенным значением в поле name
2.0 Middle🔥 131 комментариев
#Другое
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Фильтрация данных по полю name
Это базовая операция при работе с коллекциями и базами данных. Рассмотрим разные подходы в зависимости от контекста.
1. Stream API для коллекций (Рекомендуется)
Это современный функциональный подход в Java:
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public String getName() { return name; }
public int getAge() { return age; }
public String getEmail() { return email; }
}
// Фильтрация по точному значению
List<User> users = getUsers(); // Получаем список
String targetName = "John";
List<User> filtered = users.stream()
.filter(user -> user.getName().equals(targetName))
.collect(Collectors.toList());
// Или найти один результат
Optional<User> singleUser = users.stream()
.filter(user -> user.getName().equals(targetName))
.findFirst();
if (singleUser.isPresent()) {
System.out.println("Найден: " + singleUser.get().getEmail());
}
2. Stream с частичным совпадением (Like)
Для поиска по подстроке (как SQL LIKE):
String pattern = "Jo"; // Ищем имена, содержащие "Jo"
List<User> filtered = users.stream()
.filter(user -> user.getName().contains(pattern))
.collect(Collectors.toList());
// Case-insensitive поиск
String pattern2 = "john";
List<User> filtered2 = users.stream()
.filter(user -> user.getName().toLowerCase().contains(pattern2.toLowerCase()))
.collect(Collectors.toList());
// С регулярными выражениями
String regex = "^J.*n$"; // Начинается с J, заканчивается на n
List<User> filtered3 = users.stream()
.filter(user -> user.getName().matches(regex))
.collect(Collectors.toList());
3. База данных (JPA/Hibernate)
Для работы с БД используем JPQL или Criteria API:
// JPA Repository (Spring Data)
public interface UserRepository extends JpaRepository<User, Long> {
// Поиск по точному значению
List<User> findByName(String name);
// Поиск со скобками LIKE
List<User> findByNameContaining(String name);
// Игнорирование регистра
List<User> findByNameIgnoreCase(String name);
// Кастомная JPQL запрос
@Query("SELECT u FROM User u WHERE u.name = :name")
List<User> findUsersByExactName(@Param("name") String name);
}
// Использование
List<User> users = userRepository.findByName("John");
List<User> usersLike = userRepository.findByNameContaining("Jo");
4. Criteria API (Для сложных запросов)
public List<User> findUsersByNameAndAge(String name, Integer minAge) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);
List<Predicate> predicates = new ArrayList<>();
if (name != null && !name.isEmpty()) {
predicates.add(cb.like(root.get("name"), "% " + name + "%"));
}
if (minAge != null) {
predicates.add(cb.ge(root.get("age"), minAge));
}
query.where(cb.and(predicates.toArray(new Predicate[0])));
return entityManager.createQuery(query).getResultList();
}
5. SQL запрос напрямую
// JDBC с использованием параметров (защита от SQL injection)
public List<User> findByNameJDBC(String name) {
String sql = "SELECT id, name, age, email FROM users WHERE name = ?";
try (Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, name); // Безопасное внедрение параметра
try (ResultSet rs = pstmt.executeQuery()) {
List<User> users = new ArrayList<>();
while (rs.next()) {
users.add(new User(
rs.getString("name"),
rs.getInt("age"),
rs.getString("email")
));
}
return users;
}
} catch (SQLException e) {
throw new RuntimeException("Ошибка при запросе к БД", e);
}
}
6. Комбинированный пример с фильтрацией
public class UserService {
private UserRepository userRepository;
// Сложная фильтрация: по имени И по статусу
public List<User> searchUsers(String name, String status) {
return userRepository.findAll()
.stream()
.filter(u -> name == null || u.getName().toLowerCase().contains(name.toLowerCase()))
.filter(u -> status == null || u.getStatus().equals(status))
.sorted(Comparator.comparing(User::getName))
.collect(Collectors.toList());
}
// С пагинацией
public Page<User> searchUsersWithPagination(String name, Pageable pageable) {
return userRepository.findByNameContaining(name, pageable);
}
}
Рекомендации по выбору подхода
| Сценарий | Метод | Причина |
|---|---|---|
| Простая фильтрация коллекции | Stream API | Читаемо, функционально |
| Поиск в базе данных | JPA Repository | Оптимизировано, кешируется |
| Сложные условия | Criteria API | Типобезопасно, гибко |
| Очень большие таблицы | Собственный SQL | Более точный контроль |
| Множественные фильтры | Специализированные методы | Производительность |
Важные моменты
- Используй параметры в SQL — защита от SQL injection
- Индексы на поле name — для БД запросов
- Case-insensitive поиск — применяй toLowerCase() корректно
- Пагинация — для больших результатов
- Кеширование — если данные не часто меняются