如何为一对一关系编写 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认同)