Spring Data JPA(Java Persistence API)是Spring框架提供的一套基于JPA规范的持久层解决方案。它简化了数据库操作,提供了诸如CRUD操作、分页、排序等功能。投影(Projections)和命名查询(Named Queries)是Spring Data JPA中的两个重要特性。
假设我们有两个实体类User
和Order
,它们之间是一对多的关系:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Order> orders;
}
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderNumber;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
}
我们可以定义一个接口来表示投影:
public interface OrderProjection {
Long getUserId();
Long getOrderId();
}
然后在Repository中使用这个接口:
public interface OrderRepository extends JpaRepository<Order, Long> {
@Query("SELECT new com.example.OrderProjection(o.user.id, o.id) FROM Order o WHERE o.user.id = :userId")
List<OrderProjection> findOrdersByUserId(@Param("userId") Long userId);
}
首先在实体类中定义命名查询:
@Entity
@NamedQueries({
@NamedQuery(name = "Order.findByUserId",
query = "SELECT o FROM Order o WHERE o.user.id = :userId")
})
public class Order {
// ...
}
然后在Repository中使用这个命名查询:
public interface OrderRepository extends JpaRepository<Order, Long> {
@Query(name = "Order.findByUserId")
List<Order> findOrdersByUserId(@Param("userId") Long userId);
}
为了获取嵌套映射的ID,可以在Service层进行处理:
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
public List<OrderProjection> getOrdersWithNestedIds(Long userId) {
List<Order> orders = orderRepository.findOrdersByUserId(userId);
return orders.stream()
.map(o -> new OrderProjection(o.getUser().getId(), o.getId()))
.collect(Collectors.toList());
}
}
LazyInitializationException
。可以通过在Service层初始化代理对象来解决:LazyInitializationException
。可以通过在Service层初始化代理对象来解决:JOIN FETCH
来解决:JOIN FETCH
来解决:领取专属 10元无门槛券
手把手带您无忧上云