附加 table @ManytoMany 上的 JPA 存储库查询

JPA Repository Query on additional table @ManytoMany

我想在我的 jpa spring 存储库中这样做 select

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;

 

我的症状库:


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? 我尝试像 select 中那样获取值,但我得到错误映射 bean。

您可以使用 nativeQuery=true 参数

得到查询结果 List<Object[]>
@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();

其他选项是使用适当的构造函数

创建dtoclass
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);

如果您想避免使用本机查询,最好的方法是为该 JoinTable 创建一个实体。然后你可以很容易地查询它。额外的好处是,如果将来弹出一个要求,您必须在该关系中存储额外的属性,您将拥有已经存在的实体,可以轻松地做到这一点。