Spring 在JoinColumn注释的字段上编写Crudepository的findBy()方法
我是SpringJPA的新手,所以如果我的问题听起来很基本,我会提前道歉。我有两个实体对象:OrderInfo和PersonInfo。课程如下: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
@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);