Java联合主键in查询的科普文章

在数据库的设计中,联合主键(Composite Primary Key)是指由两个或多个列组合而成的主键。这种方式在很多情况下是尤为必要的,特别是当某一单列无法唯一标识一条记录时。例如,如果我们有一个订单系统,每个订单由用户ID和订单ID组成,二者组合才能唯一标识一个订单。

在Java开发中,对联合主键的处理可以通过JPA(Java Persistence API)或Hibernate等ORM(对象关系映射)技术来实现。本文将详细介绍如何在Java中进行联合主键的查询,特别是使用 IN 语句的情况。

1. 理解联合主键

在一个订单表中,示例结构如下:

ORDER int user_id int order_id string order_date USER

在这个ER图中,user_idorder_id 共同构成了一个复合主键。

2. 创建联合主键类

要在Java中实现联合主键,首先需要创建一个ID类,该类将包含作为主键的所有字段。例如,创建一个 OrderId 类:

import java.io.Serializable;
import javax.persistence.Embeddable;

@Embeddable
public class OrderId implements Serializable {
    private int userId;
    private int orderId;

    // 默认构造函数
    public OrderId() {}

    public OrderId(int userId, int orderId) {
        this.userId = userId;
        this.orderId = orderId;
    }

    // Getter和Setter
    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getOrderId() {
        return orderId;
    }

    public void setOrderId(int orderId) {
        this.orderId = orderId;
    }

    // equals和hashCode方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof OrderId)) return false;
        OrderId orderId1 = (OrderId) o;
        return userId == orderId1.userId && orderId == orderId1.orderId;
    }

    @Override
    public int hashCode() {
        return Objects.hash(userId, orderId);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.

在这个类中,我们实现了 Serializable 接口,这是因为复合主键必须是可序列化的。同时,我们重写了 equalshashCode 方法,以确保在进行集合操作时可以正确比较。

3. 创建实体类

创建一个表示订单的实体类 Order,该类使用我们刚刚定义的 OrderId 作为主键。

import javax.persistence.*;

@Entity
public class Order {
    @EmbeddedId
    private OrderId id;
    
    private String orderDate;

    // 默认构造函数
    public Order() {}

    public Order(OrderId id, String orderDate) {
        this.id = id;
        this.orderDate = orderDate;
    }

    // Getter和Setter
    public OrderId getId() {
        return id;
    }

    public void setId(OrderId id) {
        this.id = id;
    }

    public String getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(String orderDate) {
        this.orderDate = orderDate;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

4. 使用IN查询

在创建了模型类之后,我们需要进行联合主键的 IN 查询。下面是一个使用Spring Data JPA的示例:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface OrderRepository extends JpaRepository<Order, OrderId> {
    
    @Query("SELECT o FROM Order o WHERE o.id IN ?1")
    List<Order> findByOrderIds(List<OrderId> orderIds);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

该方法将接收一个 List<OrderId> 类型的参数,并返回匹配的订单列表。这是一个简单的查询方式,使用 IN 条件来查找多个联合主键对应的记录。

5. 调用IN查询示例

最后,让我们看看如何调用刚才定义的查询方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;

    public List<Order> getOrders(List<OrderId> orderIds) {
        return orderRepository.findByOrderIds(orderIds);
    }
    
    public void exampleUsage() {
        OrderId orderId1 = new OrderId(1, 1001);
        OrderId orderId2 = new OrderId(1, 1002);
        
        List<OrderId> orderIds = Arrays.asList(orderId1, orderId2);
        List<Order> orders = getOrders(orderIds);
        
        // 打印结果
        orders.forEach(order -> System.out.println(order.getId().getUserId() + ", " + order.getId().getOrderId()));
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
结论

在这篇文章中,我们学习了如何在Java中实现联合主键,并使用 IN 查询获取指定的记录。通过结合Java和JPA的强大功能,我们能够高效地处理复杂的数据查询需求。联合主键的使用不仅提升了数据的一致性和完整性,还能准确地表示许多业务场景中的实体关系。

希望这篇关于Java联合主键 IN 查询的文章对你有所帮助!