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

Какие задачи делал на SQLAcademy

1.2 Junior🔥 181 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Работа с SQLAlchemy в Java/Hibernate

Предполагаю, что вопрос о SQLAlchemy (Python ORM) или его аналога в Java — Hibernate/JPA. В Java-проектах используются аналогичные паттерны работы с базами данных через ORM.

Основные задачи при работе с ORM

1. Создание моделей сущностей

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    private UUID id;
    
    @Column(nullable = false, unique = true)
    private String email;
    
    @Column(nullable = false)
    private String firstName;
    
    @Column(nullable = false)
    private String lastName;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_at")
    private LocalDateTime createdAt;
}

2. Определение связей между таблицами

One-to-Many связь:

@Entity
@Table(name = "users")
public class User {
    @Id
    private UUID id;
    
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Order> orders = new ArrayList<>();
}

@Entity
@Table(name = "orders")
public class Order {
    @Id
    private UUID id;
    
    @ManyToOne
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
}

Many-to-Many связь:

@Entity
@Table(name = "users")
public class User {
    @Id
    private UUID id;
    
    @ManyToMany
    @JoinTable(
        name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private Set<Role> roles = new HashSet<>();
}

3. Написание CRUD операций

@Repository
public interface UserRepository extends JpaRepository<User, UUID> {
    Optional<User> findByEmail(String email);
    List<User> findByFirstNameContainingIgnoreCase(String firstName);
}

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    // Create
    public User createUser(User user) {
        return userRepository.save(user);
    }
    
    // Read
    public User getUserById(UUID id) {
        return userRepository.findById(id)
            .orElseThrow(() -> new EntityNotFoundException("User not found"));
    }
    
    // Update
    public User updateUser(UUID id, User userDetails) {
        User user = getUserById(id);
        user.setEmail(userDetails.getEmail());
        user.setFirstName(userDetails.getFirstName());
        return userRepository.save(user);
    }
    
    // Delete
    public void deleteUser(UUID id) {
        userRepository.deleteById(id);
    }
}

4. Написание сложных запросов

@Repository
public interface OrderRepository extends JpaRepository<Order, UUID> {
    // JPQL запрос
    @Query("SELECT o FROM Order o WHERE o.user.id = :userId AND o.status = :status")
    List<Order> findUserOrdersByStatus(@Param("userId") UUID userId, @Param("status") String status);
    
    // Native SQL
    @Query(value = "SELECT * FROM orders o JOIN users u ON o.user_id = u.id WHERE u.email = :email", nativeQuery = true)
    List<Order> findOrdersByUserEmail(@Param("email") String email);
    
    // Производные методы
    List<Order> findByUserIdAndStatusOrderByCreatedAtDesc(UUID userId, String status);
}

5. Использование Eager/Lazy loading

@Entity
@Table(name = "orders")
public class Order {
    @Id
    private UUID id;
    
    // LAZY (по умолчанию) — загружает только при обращении
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
    
    // EAGER — загружает сразу с заказом
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<OrderItem> items;
}

6. Работа с транзакциями

@Service
public class PaymentService {
    @Transactional  // Откатит все изменения при исключении
    public void processPayment(UUID orderId, BigDecimal amount) {
        Order order = orderRepository.findById(orderId)
            .orElseThrow(() -> new EntityNotFoundException("Order not found"));
        
        order.setStatus("PAID");
        orderRepository.save(order);
        
        Payment payment = new Payment();
        payment.setOrder(order);
        payment.setAmount(amount);
        paymentRepository.save(payment);  // Если здесь exception — отката оба save
    }
}

7. Миграции базы данных

В Java используются инструменты как Flyway или Liquibase:

// Файл: db/migration/V1__Create_users_table.sql
CREATE TABLE users (
    id UUID PRIMARY KEY,
    email VARCHAR(255) NOT NULL UNIQUE,
    first_name VARCHAR(100),
    created_at TIMESTAMP DEFAULT NOW()
);

8. Оптимизация запросов (N+1 проблема)

// ❌ Плохо — N+1 queries
List<User> users = userRepository.findAll();
for (User user : users) {
    user.getOrders().size();  // Дополнительный запрос для каждого пользователя
}

// ✅ Хорошо — 1 запрос с JOIN FETCH
@Query("SELECT DISTINCT u FROM User u LEFT JOIN FETCH u.orders")
List<User> findAllWithOrders();

Основные задачи с ORM: моделирование сущностей, определение связей, CRUD операции, оптимизация запросов и управление транзакциями.

Какие задачи делал на SQLAcademy | PrepBro