Search code examples
spring-data-jparepositorymany-to-many

JPA Repository Query on additional table @ManytoMany


I want to do select like this in my jpa spring repository

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;

My enitity

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

 

My Symptomp repository:


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

}

How I can create this select in my JPA repository? I try get value like in select but i got error mapping bean.


Solution

  • You can get query result as List<Object[]> using nativeQuery=true parameter

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

    Other option is to create dto class with appropriate constructor

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

    Then using JPQL

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