Spring Data JPA: FindBy в столбце соединения

avatar
mifol68042
1 июля 2021 в 16:22
2985
1
4

Я настроил два объекта, как показано ниже, в сопоставлении один к одному, и я пытаюсь выполнить запрос к столбцу соединения, как показано ниже, в моем хранилище:

@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??

Источник

Ответы (1)

avatar
ThilankaD
1 июля 2021 в 17:47
3

Поскольку вы не определили имя столбца для id в A, по умолчанию имя столбца будет 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, чтобы Spring знал, что его следует рассматривать как компонент репозитория.

@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);
}