← Назад к вопросам

Как сделать вывод данных с определенным значением в поле 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() корректно
  • Пагинация — для больших результатов
  • Кеширование — если данные не часто меняются