Запрос репозитория JPA к дополнительной таблице @ManyToMany

#spring-data-jpa #repository #many-to-many

#spring-data-jpa #репозиторий #многие ко многим

Вопрос:

Я хочу сделать такой выбор в моем репозитории jpa spring

 SELECT  sicknes_id, count(symptomp_id) as ilosc FROM symptomp_sicknes where symptomp_id IN (1,2) group by sicknes_id Order by  ilosc DESC;
  

Моя сущность

 @Entity
@Table(name = "symptomp")
public class Symptomp {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "symptomp_id")
    private Long symptomp_id;
    @Column(name = "name")
    private String name;
    @Column(name = "description")
    private String description;
    @ManyToMany(cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH}, fetch = FetchType.LAZY)
    @JoinTable(name = "symptomp_sicknes",joinColumns = @JoinColumn(name = "symptomp_id"),inverseJoinColumns = @JoinColumn(name = "sicknes_id"))
    private Set<Sicknes> sicknes = new HashSet<>();


  
 @Entity
@Table(name = "sicknes")
public class Sicknes {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "sicknes_id")
    private Long sicknes_id;
    @Column(name = "name")
    private String name;
    @Column(name = "description")
    private  String description;
    @ManyToOne(cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH}, fetch = FetchType.LAZY)
    @JoinColumn(name = "speciesId")
    private Species species;

 
  

Мой репозиторий Symptomp:

 
public interface SymptompRepository extends JpaRepository<Symptomp, Long> {

    @Query("select p from Symptomp p where name like ?1%")
    public List<Symptomp> findAllBySymptompName(String symptomp);

    public Symptomp findByName(String symptomp);


    public List<Symptomp> findByNameIn(List<String> list);


    Integer countDistinctSymptompByName(String id);

}

  

Как я могу создать этот выбор в моем репозитории JPA?
Я пытаюсь получить значение, как в select, но я получил компонент сопоставления ошибок.

Ответ №1:

Вы можете получить результат запроса в качестве List<Object[]> nativeQuery=true параметра using

 @Query("SELECT  sicknes_id, count(symptomp_id) as ilosc FROM symptomp_sicknes where symptomp_id IN (1,2) group by sicknes_id Order by  ilosc DESC", nativeQuery=true)
List<Object[]> getQueryResult();
  

Другой вариант — создать dto класс с соответствующим конструктором

 public class QueryResultDto {
    Long sicknesId;
    Long count;

    public QueryResultDto(Long sicknesId, Long count) {
        this.sicknesId = sicknesId;
        this.count = count;
    }
}
  

Затем с помощью JPQL

 @Query("select new yourproject.dtopath.QueryResultDto(...")
List<QueryResultDto> getQueryResult(@Param("symptompIds") List<Long> symptompIds);
  

Ответ №2:

Если вы хотите избежать собственного запроса, лучший способ — создать объект для этой объединяемой таблицы. Затем вы можете легко запросить его. Дополнительное преимущество в этом случае заключается в том, что если в будущем появится требование о том, что вам нужно хранить дополнительные атрибуты в этом отношении, у вас уже будет объект, чтобы сделать это легко.