Spring Data JPA:连接列上的FindBy

v1l68za4  于 12个月前  发布在  Spring
关注(0)|答案(2)|浏览(225)

我已经在一对一Map中设置了两个实体,我试图在我的仓库中的joincolumn上查询:

@Entity
@Table(name = "a")
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper=false)
public class A extends Auditable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true)
    @Size(min = 1, max = 100)
    private String name;
}

@Entity
@Table(name = "b")
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper=false)
public class B extends Auditable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    @Size(min = 1, max = 100)
    private String name;

    @OneToOne
    @JoinColumn(name="aId", referencedColumnName = "aId")
    private A aId;

}

字符串
在我的BRepository.java中,我正在尝试这样做:

@Component
public interface BRepository extends JpaRepository<B, Long> {
    List<B> findAllBByA_aId(String aId);
}


我得到以下错误:
No property a found for type B! Did you mean 'aId'?
这不是spring-data中查询join列的正确方法吗?

7kqas0il

7kqas0il1#

由于您没有在A中定义id的列名,因此列名将默认为id。然后在类B中,您应该将referencedColumnName更改为id(或者您可以简单地跳过referencedColumnName属性,因为它可以直接从OneToOne关系中的目标实体派生)

@Entity
@Table(name = "b")
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper=false)
public class B extends Auditable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    @Size(min = 1, max = 100)
    private String name;

    @OneToOne
    @JoinColumn(name="aId", referencedColumnName = "id")
    private A aId;

}

字符串
在repository中,您需要使用@Repository annotation对其进行注解,以让Spring知道它应该被视为Repository Bean。

@Repository
public interface BRepository extends JpaRepository<B, Long> {
    
    @Query(value="select b from B b where B.aId.id=?1")
    List<B> findAllBByA_aId(String aId);
}


或者直接使用SPeL,

@Repository
public interface BRepository extends JpaRepository<B, Long> {
    
    List<B> findAllByaIdId(String aId);
}

wgxvkvu9

wgxvkvu92#

在我的例子中,下面的@Query对我来说很有效。在'WHERE'之后,我使用了示例而不是仓库名称。基本上,我必须使用"b“而不是" b”。
第一个月

相关问题