Spring 在JoinColumn注释的字段上编写Crudepository的findBy()方法

Spring 在JoinColumn注释的字段上编写Crudepository的findBy()方法,spring,jpa,spring-data-jpa,Spring,Jpa,Spring Data Jpa,我是SpringJPA的新手,所以如果我的问题听起来很基本,我会提前道歉。我有两个实体对象:OrderInfo和PersonInfo。课程如下: @Entity @Table(name="order_info") @NamedQuery(name="OrderInfo.findAll", query="SELECT o FROM OrderInfo o") public class OrderInfo implements Serializable { @Column(name="or

我是SpringJPA的新手,所以如果我的问题听起来很基本,我会提前道歉。我有两个实体对象: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;
    }


}
个人和实体:

@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;
    }

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

现在,我正试图编写一个crudepository来获取给定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。相反,它又引用了一个人,我没有编写实体类。它们是由Eclipse自动生成的。我现在应该如何编写findBy方法

提前感谢。

使用JPQL查询:

@Query("select o from OrderInfo o where o.orderNumber = :orderNumber"
       + " and o.personInfo.id = :personId")

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

@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\u user\u sender查找所有邮件

public interface MessageRepository extends JpaRepository<Message,Long>,TransactionRepositoryCustom {
    List<Message> findByUserSenderId(Long idUser);
}
解释: 在消息实体中,我有一个名为“userSender”的用户对象。userSender有一个名为“id”的字段

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

另一种可能是向消息存储库传递完整的用户对象,如下例所示:用户对象必须只包含id

public interface MessageRepository extends JpaRepository<Message,Long>,TransactionRepositoryCustom {
   List<Message> findByUserSender(User user);
}

我相信这就是你想要的:

对于您的代码,这可能有用我没有尝试过:


public OrderInfo FindBypersonInfo和orderNumber Long PersonInfo,字符串orderNumber

我认为您需要更新spring数据jpa版本。 我目前正在使用spring-data-jpa-2.0.2.RELEASE,它运行良好

而且,它对这两种情况都有效。 您可以将接口方法定义为-

List<Message> findByUserSender(User user);
或-


这两种方法都将在user_sender表上创建一个左外部联接,以获取所需的消息

谢谢。但我不想使用手动JPQL。单独编写方法定义没有其他方法可以做到这一点吗?如果某个方法有效,则必须找到bypersoninfo和rdernumber,因为您的字段是name personInfo而不是person。但实际上,您应该更喜欢可读的方法名称。编写这样一个简单的查询并不难。这个解决方案对我来说失败了,因为无法在此ManagedType[…]上找到名为blablaId的属性,这对我来说很有效。确保字段采用驼峰式大小写。此外,如果上述方法不起作用,请尝试使用下划线来解决findByUserSender_Id的歧义:
List<Message> findByUserSenderId(Long idUser);