Spring Data JPA: как найти один столбец внутри коллекции? - PullRequest
0 голосов
/ 26 марта 2020

Я пробовал различные примеры, но я мог бы обернуть это вокруг головы.

Я хотел получить доступ к указанному столбцу c из коллекции. Я пытаюсь получить статус контракта из таблицы ProjectContract.

ProjectContract > ContractStatusCdtb > contractStatCd

Вот мои настройки:

public class ProjectContract extends Auditable<String> implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "CONT_SEQ_NUM")
    private Integer contractSeqNum;

    @Exclude
    @ManyToOne(cascade = CascadeType.DETACH)
    @JoinColumn(name = "CONT_STAT_CD")
    private ContractStatusCdtb contractStatusCdtb;
    // many fields removed.....
}
@Entity(name="CONTRACT_STATUS_CDTB")
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class ContractStatusCdtb {

    @Id 
    @Column(name = "CONT_STAT_CD")
    private String contractStatCd;

    // some fields removed

}

, и это мой репозиторий:

public interface ProjectContractRepository extends JpaRepository<ProjectContract, Integer> {
    public String findContractStatusCdtbContractStatCdByContractSeqNum(Integer contractId);
}

Hibernate запускает запрос для получения всего ProjectContract. и я также получаю ошибку Class Cast, так как я возвращаю String, а не ProjectContract.

Не могли бы вы дать мне указатель, где я делаю неправильно?

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Чтобы получить один столбец из конкретной таблицы с помощью Spring Data JPA, используйте аннотацию @Query для передачи hql / jpql, который будет запускаться при вызове метода.

Так что для вашего случая использования код должен выглядеть как:

    public interface ProjectContractRepository extends JpaRepository<ProjectContract, Integer> {

        @Query(value = "select cs.contractStatCd from ProjectContract pc join pc.contractStatusCdtb cs where pc.contractId = :contractId")
        public String findContractStatusCdtbContractStatCdByContractSeqNum(@Param("contractId") Integer contractId);
    }
0 голосов
/ 26 марта 2020

Есть пара баллов.

  1. Невозможно получить отдельный столбец. Это всегда должен быть объект типа, который упоминается в extends JpaRepository<ProjectContract, Integer>, который в вашем случае равен ProjectContract.
    Таким образом, ваш запрос неверен, как вы можете видеть из сообщения об ошибке. Вам нужно изменить это значение на

    public ProjectContract findByContractStatusCdtbContractStatCd(String contractStatCd);
    

Или, если вы ожидаете, что будет возвращено несколько строк

public List<ProjectContract> findByContractStatusCdtbContractStatCd(String contractStatCd);
Существует еще одна опция для извлечения одного или нескольких указанных c столбцов. Для этого Вам необходимо использовать Прогнозы. Смотри здесь
...