#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:
Если вы хотите избежать собственного запроса, лучший способ — создать объект для этой объединяемой таблицы. Затем вы можете легко запросить его. Дополнительное преимущество в этом случае заключается в том, что если в будущем появится требование о том, что вам нужно хранить дополнительные атрибуты в этом отношении, у вас уже будет объект, чтобы сделать это легко.