我是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;
}
}
这两个类是在Eclipse中使用JPA&create entityfromtable选项自动生成的。
现在,我正在尝试编写一个CRUDRepository来获取orderInfo,并给出orderNumber和personId。如果我在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()方法?
提前致谢。
答案 0 :(得分:6)
我找到了另一种解决方案,假设我们有一个用户实体和消息实体。
@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);
}
Explantion: 在Message实体中,我有一个名为'userSender'的用户对象。 userSender有一个名为“id”的字段。
所以'findByUserSenderId'在userSender对象中搜索id。
另一种可能性是将完整的User对象传递给消息存储库,如下例所示:( User对象必须只包含id)
public interface MessageRepository extends JpaRepository<Message,Long>,TransactionRepositoryCustom {
List<Message> findByUserSender(User user);
}
答案 1 :(得分:1)
使用JPQL查询:
@Query("select o from OrderInfo o where o.orderNumber = :orderNumber"
+ " and o.personInfo.id = :personId")
答案 2 :(得分:0)
我相信这就是你要找的东西: Spring Data JPA - Repositories - Property expressions
对于您的代码,这可能有效(我没有尝试过):
public OrderInfo findByPersonInfoIdAndOrderNumber(Long personInfoId, String orderNumber);
答案 3 :(得分:0)
我认为您需要更新spring数据jpa版本。 我目前正在使用spring-data-jpa-2.0.2.RELEASE,它运行良好。
此外,它适用于这两种情况。 您可以将接口方法定义为 -
List<Message> findByUserSenderId(Long idUser);
或 -
{{1}}
这两种方法都会在user_sender表上创建一个左外连接来获取所需的消息;