在由 JoinColumn 注释的字段上编写 CRUDRepository 的 findBy() 方法

2024-02-12

我对 Spring JPA 有点陌生,所以如果我的问题听起来很基本,我提前道歉。我有 2 个实体对象:OrderInfo 和 PersonInfo。班级如下:

@Entity
@Table(name="order_info")
@NamedQuery(name="OrderInfo.findAll", query="SELECT o FROM OrderInfo o")
public class OrderInfo implements Serializable {

    @Column(name="order_number")
    private String orderNumber;

    //bi-directional many-to-one association to PersonInfo
    @ManyToOne
    @JoinColumn(name="person_id")
    private PersonInfo personInfo;

    public String getOrderNumber() {
        return this.orderNumber;
    }

    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }

    public PersonInfo getPersonInfo() {
        return this.personInfo;
    }

    public void setPersonInfo(PersonInfo personInfo) {
        this.personInfo = personInfo;
    }


}

以及 Person 实体:

@Entity
@Table(name="person_info")
@NamedQuery(name="PersonInfo.findAll", query="SELECT p FROM PersonInfo p")
public class PersonInfo implements Serializable {

    //bi-directional many-to-one association to OrderInfo
    @OneToMany(mappedBy="personInfo")
    private List<OrderInfo> orderInfos;

    public List<OrderInfo> getOrderInfos() {
        return this.orderInfos;
    }

    public void setOrderInfos(List<OrderInfo> orderInfos) {
        this.orderInfos = orderInfos;
    }

    public OrderInfo addOrderInfo(OrderInfo orderInfo) {
        getOrderInfos().add(orderInfo);
        orderInfo.setPersonInfo(this);

        return orderInfo;
    }

    public OrderInfo removeOrderInfo(OrderInfo orderInfo) {
        getOrderInfos().remove(orderInfo);
        orderInfo.setPersonInfo(null);

        return orderInfo;
    }

}

这两个类是使用 JPA 的 createentityfromtable 选项在 Eclipse 中自动生成的。

现在,我正在尝试编写一个 CRUDRepository 来获取给定 orderNumber 和 personId 的 OrderInfo。如果 OrderInfo 对象中有一个 personId 字段,我可以写类似的内容

@Repository
public interface OrderRepository extends CrudRepository<OrderInfo, Integer>{
    public OrderInfo findByPersonIdAndOrderNumber(@Param("personId") Long personId, @Param("orderNumber") String orderNumber);

}

但是,现在 OrderInfo 实体没有 personId。相反,它具有对 Person 的引用(同样,我没有编写实体类。它们是由 Eclipse 自动生成的)。我现在应该如何编写 findBy() 方法?

提前致谢。


我找到了另一个解决方案,假设我们有一个用户实体和消息实体。

@Entity
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    private DateTime date;

    @ManyToOne
    @JoinColumn(name = "id_user_sender")
    private User userSender;

    @NotNull
    private Long idUserReceiver;

    @NotNull
    @Length(min = 10)
    private String message;

    @NotNull
    private String idConversation;

    @NotNull
    Boolean userHasRead;

    //Getters and Setters

}



@Entity
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    //Some other properies like email,name etc
    //Getters and setters
}

现在我需要查找 id_user_sender 的所有消息。

public interface MessageRepository extends JpaRepository<Message,Long>,TransactionRepositoryCustom {
    List<Message> findByUserSenderId(Long idUser);
}

解释:

在消息实体中,我有一个名为“userSender”的用户对象。这 userSender 有一个名为“id”的字段。

因此,“findByUserSenderId”在 userSender 对象中搜索 id。


另一种可能性是将完整的 User 对象传递到消息存储库,如下例所示:(User 对象必须仅包含 id)

public interface MessageRepository extends JpaRepository<Message,Long>,TransactionRepositoryCustom {
   List<Message> findByUserSender(User user);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在由 JoinColumn 注释的字段上编写 CRUDRepository 的 findBy() 方法 的相关文章

随机推荐