как найти данные по атрибуту (name_techno) в jpql - PullRequest
0 голосов
/ 11 октября 2019

Я разрабатываю приложение, которое позволяет управлять кандидатами в компании, для этого я использую Spring-Boot, чтобы выбрать сотрудников, владеющих такой технологией (Techno). Я использовал запрос JPQL.

Итак, как мне найти кандидата по техно?

В своем проекте я использовал этот код:

1 - класс candidat.java

@Entity
public class Candidat {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "candidat_id")

    private int id;

    private String nom;
    private String prenom;
    private String ville;
    private int numTel;
    private String mail;
    private String pseudo;
    private String roleCible;
    private String typeContrat;
    private String villeRecherchee;

    @OneToMany(mappedBy="candidat")
    private List<Techno> techno;

    @Temporal(TemporalType.DATE)
    private Date date;

    @OneToMany
    private List<SecteurActivites> secteurActivites;

    public Candidat() {
        // TODO Auto-generated constructor stub
    }

2- класс Техно.джава

@Entity
public class Techno {
    @Id
    @GeneratedValue
    @Column(name = "techno_id")
    private int id ;

    private String nomTechno;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "candidat_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonIgnore
    private Candidat candidat;
    public Techno() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @param nomTechno
     * @param candidat
     */
    public Techno(String nomTechno, Candidat candidat) {
        super();
        this.nomTechno = nomTechno;
        this.candidat = candidat;
    }

3- My CandidatController

@GetMapping(value = "/GetAllCandidats/{nomTechno}")
public List<Candidat> afficherCandidat(@PathVariable ("nomTechno")  String nomTechno){

     return  candidatdao.findByTechno(nomTechno);
}

4- хранилище:

@Repository
public interface CandidatDao extends JpaRepository <Candidat, String>{

    List<Candidat> findByDate(Date date);

    @Query("SELECT DISTINCT e FROM Candidat e INNER JOIN e.Techno t")
    List<Candidat> findByTechno(String nomTechno);
    }

5- app.properties

server.port= 9090
spring.jpa.show-sql = true
spring.datasource.url= jdbc:mysql://localhost:3306/database
spring.datasource.username=??
spring.datasource.password=??
spring.jpa.hibernate.ddl-auto=update

Результат в консоли :

"Validation failed for query for method public abstract java.util.List com.avatar.dao.CandidatDao.findByTechno(java.lang.String)!"

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Вы можете объявить следующий метод в своем JpaRepository (также удалить @Query, он не нужен).

List<Candidat> findDistinctByTechnoNomTechno(String nomTechno);

Также в Techno.java вы должны добавить аннотацию @Column и сопоставить ее ссхема БД.

Я не уверен, что вы преднамеренно вставили неполный код вашей сущности. Если нет, то ваши сущности не верны. Вы должны создать сеттеры / геттеры следующим образом:

 private String nomTechno;

@Column(name = "NOM_TECHNO")
public String getNomTechno() {
    return nomTechno;
}

public void setNomTechno(String nomTechno){
   this.nomTechno = nomTechno;
}

. Сделайте то же самое для всех переменных в ваших сущностях.

0 голосов
/ 11 октября 2019

Вам не нужно добавлять явное @Query для этого, данные Spring могут сформулировать запрос, если у вас есть правильные имена методов

Вместо

@Query("SELECT DISTINCT e FROM Candidat e INNER JOIN e.Techno t")
List<Candidat> findByTechno(String nomTechno);

Попробуйте это

List<Candidat> findDistinctByTechno_NomTechno(String nomTechno);
...