如何为一对一关系编写 Spring JPA 查询?

A j*_*A j 0 spring-data spring-data-jpa

我是 Spring JPA 的新手(或者说是在很长一段时间后研究它),我需要一些帮助来编写 JPA 存储库。我有一个实体类 Itinerary 和 User。两者之间是一对一的关系。

@Entity
@Table(name = "ITINERARY")
public class Itinerary implements Serializable {

    @Id
    @Column(name = "ID")
    @GeneratedValue(generator = "Itinerary_IDGenerator", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "Itinerary_IDGenerator", sequenceName = "Itinerary_IDGenerator", allocationSize = 1)
    private long id;

    @Basic(optional = false)
    @Column(nullable = false)
    @Temporal(TemporalType.DATE)
    private Date itineraryDate;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "USER_ID")
    User user;
}

@Entity
@Table(name = "USER")
public class User implements Serializable {

    @Id
    @Column(name = "ID")
    @GeneratedValue(generator = "User_IDGenerator", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "User_IDGenerator", sequenceName = "User_IDGenerator", allocationSize = 1)
    private long id;

    @Basic(optional = false)
    @Column(unique = true, nullable = false)
    private String signInName;
}
Run Code Online (Sandbox Code Playgroud)

我想为 Itinerary 实体编写一个 Spring JPA 存储库,以便有一个方法可以返回用户的行程(具有特定的 singInName)和行程日期。我写了如下接口,但是不知道怎么指定spring查询。我提供了一个有效的 JPA 查询。

public interface ItineraryRepository extends Repository<Itinerary, Long> {

    //String queryStr = "select i from Itinerary i where i.user.signInName = '" + signedInUser + "' and i.itineraryDate = :today";

    @Query(select i from Itinerary i where i.user.signInName = :signInName and i.itineraryDate = :today)
    Itinerary findBySignInNameAndDate(@Param("signInName") String signInName, @Param("itineraryDate") Date itineraryDate);

}
Run Code Online (Sandbox Code Playgroud)

我在查询中遇到错误。

Invalid derived query! No property signInName found for type Itinerary!
Run Code Online (Sandbox Code Playgroud)

和

Syntax error on tokens, delete these tokens
Run Code Online (Sandbox Code Playgroud)

如何将此查询转换为 spring 查询?我在文档中找不到示例。我不确定这是否可能,以及我是否错误地使用了存储库。

pvp*_*ran 5

在您的存储库界面中使用此方法。而且不需要@Query

 findByItineraryDateAndUser_SignInName(Date itineraryDate, String signInName);
Run Code Online (Sandbox Code Playgroud)

Spring 数据足够智能,可以根据您的方法名称(至少在简单查询情况下)了解它需要使用什么查询来获取结果。

User_SignInName 指定在属性 user 中查找属性 signInName。

  • 否。返回类型将始终是实体类型,除非您使用投影 (2认同)