Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Spring数据JPA中的正常字段查找时获取子实体_Spring_Hibernate_Spring Data_Spring Data Jpa - Fatal编程技术网

通过Spring数据JPA中的正常字段查找时获取子实体

通过Spring数据JPA中的正常字段查找时获取子实体,spring,hibernate,spring-data,spring-data-jpa,Spring,Hibernate,Spring Data,Spring Data Jpa,我正在使用Spring数据JpaRepository查找与特定字段匹配的实体列表。考虑下面的代码片段: 实体: @Entity @Table(name = "master") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class Master implements Serializable { private static final long serialVersionUID = 1L;

我正在使用Spring数据
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;
public interface MasterRepository extends JpaRepository<Master,Long> {

    List<Master> findMasterByUserId(String userId);

}
Spring数据自定义JPA存储:

@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;
public interface MasterRepository extends JpaRepository<Master,Long> {

    List<Master> findMasterByUserId(String userId);

}
public interface MasterRepository扩展了JpaRepository{
列出findMasterByUserId(字符串userId);
}
当我使用
findbookingsmasterbyuserid
repository方法查找具有特定用户id的所有记录时,我得到的是
Master
实体的列表,但我没有得到其中包含
id
作为外键的
Details
实体

然而,当我使用
JpaRepository
的开箱即用
findAll
方法时,我得到了所有的依赖实体,但是使用custom
findMasterByUserId
存储库方法时,子实体并没有被急切地获取

任何形式的帮助都将不胜感激。谢谢

您的实体名称是“主”而不是“预订主”

将您的方法更改为:

List<Master> findByUserId(String userId);
列出findByUserId(字符串userId);
有关JPA查询创建机制的更多信息,请参阅下面的spring文档

或者

@Query("SELECT m FROM Master m WHERE m.userId = :userId")
List<Master> findByUserId(@Param("userId") String userId);
@Query(“从Master m中选择m,其中m.userId=:userId”)
列出findByUserId(@Param(“userId”)字符串userId);
从方法名称生成查询是一种查询生成策略,其中调用的查询是从查询方法的名称派生的

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

  • 查询方法的名称必须以下列之一开头 前缀:find…By、read…By、query…By、count…By和get…By
  • 如果要限制返回的查询结果的数量,可以添加 第一个单词前的第一个或最上面的关键字。如果我们想 如果要得到多个结果,我们必须附加可选的数值 第一个和顶部关键字的值。例如,findTopBy, findTop1By、findFirstBy和findFirst1By都返回第一个实体 与指定的搜索条件匹配的
  • 如果我们想要选择唯一的结果,我们必须添加不同的 关键字前面的第一个按单词。例如,findtitleditinctby或 FindDistincTitleby意味着我们要选择所有唯一的标题 从数据库中找到的
  • 我们必须在第一个查询之后添加查询方法的搜索条件 逐字逐句。我们可以通过组合属性来指定搜索条件 具有支持的关键字的表达式
  • 如果我们的查询方法指定了x个搜索条件,则必须添加x 方法的参数。换句话说,方法的数量 参数必须等于搜索条件的数目。也, 方法参数的给定顺序必须与搜索相同 条件
您的实体名称是“Master”而不是“booking\u Master”

将您的方法更改为:

List<Master> findByUserId(String userId);
列出findByUserId(字符串userId);
有关JPA查询创建机制的更多信息,请参阅下面的spring文档

或者

@Query("SELECT m FROM Master m WHERE m.userId = :userId")
List<Master> findByUserId(@Param("userId") String userId);
@Query(“从Master m中选择m,其中m.userId=:userId”)
列出findByUserId(@Param(“userId”)字符串userId);
从方法名称生成查询是一种查询生成策略,其中调用的查询是从查询方法的名称派生的

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

  • 查询方法的名称必须以下列之一开头 前缀:find…By、read…By、query…By、count…By和get…By
  • 如果要限制返回的查询结果的数量,可以添加 第一个单词前的第一个或最上面的关键字。如果我们想 如果要得到多个结果,我们必须附加可选的数值 第一个和顶部关键字的值。例如,findTopBy, findTop1By、findFirstBy和findFirst1By都返回第一个实体 与指定的搜索条件匹配的
  • 如果我们想要选择唯一的结果,我们必须添加不同的 关键字前面的第一个按单词。例如,findtitleditinctby或 FindDistincTitleby意味着我们要选择所有唯一的标题 从数据库中找到的
  • 我们必须在第一个查询之后添加查询方法的搜索条件 逐字逐句。我们可以通过组合属性来指定搜索条件 具有支持的关键字的表达式
  • 如果我们的查询方法指定了x个搜索条件,则必须添加x 方法的参数。换句话说,方法的数量 参数必须等于搜索条件的数目。也, 方法参数的给定顺序必须与搜索相同 条件

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

@EntityGraph(attributePaths = {"details"})
List<Master> findBookingMasterByUserId(String userId); 
@EntityGraph(attributePath={“details”})
列出findBookingMasterByUserId(字符串userId);

注意:不要忘记将“详细信息”字段更改为“详细信息”

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

@EntityGraph(attributePaths = {"details"})
List<Master> findBookingMasterByUserId(String userId); 
@EntityGraph(attributePath={“details”})
列出findBookingMasterByUserId(字符串userId);

注意:不要忘记将“详细信息”字段更改为“详细信息”

尝试使用
@Query
?@Rossi我不想编写自定义查询,但想使用JpaRepository本身。尝试使用
@Query
?@Rossi我不想编写自定义查询,但想使用JpaRepository本身。谢谢@Tanmay。在问题中,我错误地编写了findBookingMasterByUserId而不是findMasterByUserId。实际上,我不想编写查询,而是想使用spring自己的JpaRepository来执行任务。您只编写findByUserId而不是findMasterByUserId。返回类型本身指定要返回的主文件列表。尝试我的第一个答案,使用Spring自己的方法。列出findByUserId(字符串userId);这是如何回答这个问题的?我了解