在Spring Data JPA

时间:2017-07-07 18:30:01

标签: spring hibernate spring-data spring-data-jpa

我正在使用Spring Data JpaRepository来查找与特定字段匹配的实体列表。请考虑以下代码段:

实体:

@Entity
@Table(name = "master")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Master implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    @Column(name = "id", nullable = false)
    private Long Id;

@NotNull
    @Column(name = "user_id", nullable = false)
    private String userId;

@OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="id", referencedColumnName="id", insertable=false, updatable=false)
    private Details Details;

Spring Data Custom JpaRepository:

public interface MasterRepository extends JpaRepository<Master,Long> {

    List<Master> findMasterByUserId(String userId);

}

当我使用findBookingMasterByUserId存储库方法查找具有特定用户ID的所有记录时,我获得了Master实体的列表,但我没有获得具有Details实体的id实体{1}}作为其中的外键。

但是,当我使用findAll开箱即用JpaRepository方法时,我得到所有依赖实体,但使用自定义findMasterByUserId存储库方法时,不会急切地获取子实体。

任何类型的帮助都将受到高度赞赏。谢谢!

2 个答案:

答案 0 :(得分:1)

您的实体名称是&#34; Master&#34;不是&#34; booking_master&#34;。

将您的方法更改为:

List<Master> findByUserId(String userId);

有关JPA的查询创建机制的更多信息,请参阅下面的spring文档。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

可替换地,

@Query("SELECT m FROM Master m WHERE m.userId = :userId")
List<Master> findByUserId(@Param("userId") String userId);

从方法名称生成查询是一种查询生成策略,其中调用的查询是从查询方法的名称派生的。

我们可以按照以下规则创建使用此策略的查询方法:

  • 我们的查询方法的名称必须以下列之一开头 前缀:查找...通过,阅读...通过,查询...通过,计数......通过,得到......通过。
  • 如果我们想限制返回的查询结果的数量,我们可以添加 第一个By字之前的First或Top关键字。如果我们想 得到多个结果,我们必须附加可选的数字 值为First和Top关键字。例如,findTopBy, findTop1By,findFirstBy和findFirst1By都返回第一个实体 与指定的搜索条件匹配。
  • 如果我们想要选择独特的结果,我们必须添加Distinct 关键字在第一个按字之前。例如,findTitleDistinctBy或 findDistinctTitleBy意味着我们要选择所有唯一标题 从数据库中找到。
  • 我们必须在第一个之后添加查询方法的搜索条件 通过语言。我们可以通过组合属性来指定搜索条件 支持关键字的表达式。
  • 如果我们的查询方法指定x搜索条件,我们必须添加x 方法参数。换句话说,方法的数量 参数必须等于搜索条件的数量。也, 必须以与搜索相同的顺序给出方法参数 条件。

答案 1 :(得分:1)

您可以在回购中使用@EntityGraph来急切获取相关数据:

@EntityGraph(attributePaths = {"details"})
List<Master> findBookingMasterByUserId(String userId); 

P.S。不要忘记改变&#39;详细信息&#39;字段到details;