<expression> ожидаемый получил <from>в спящем режиме весенних данных - PullRequest
0 голосов
/ 05 июня 2018

Работа с spring-data и hibernate и попытка записать этот запрос в репозиторий:

    @Query("select u from AppUser u inner join u.roles r inner join u.contrats c where r = :role and not exists ( from c.project p where p = :project)")

Моя цель - получить список AppUser (Users) от объекта AppUer, но с условием, толькоте, у кого нет проекта лица.

Чтобы объяснить больше, существует сущность Contrat между Project и AppUser, она содержит проект Project, AppUser Appuser.

Существует сопоставление между one_to_many между AppUser и Contrat (AppUser может иметь несколько контрастов).

Также сопоставление one_to_many между Contrat и проектом (один проект может иметь несколько контратов).

Проблема состоит в том, что этот запрос возвращает пустой список, в то время как он должен вернуть список из 12пользователи, поскольку у них нет указанного проекта, я передал ему.

Я отмечаю в этом запросе (из c.project p, где p =: project) 'from' подчеркнута красной линией, говоря:

<expression> expected got <from> in spring-data hibernate.

Есть идеи?

Редактировать

Entity AppUser

@Entity
@Data
@AllArgsConstructor @NoArgsConstructor
public class AppUser implements Serializable {

    @Id @GeneratedValue
    private Long id;
    @Column(unique = true)
    private String username;
    private String password;
    private String prenom;
    private String nom;
    private Long tel;
    private String cin;
    private String email ;
    @ManyToMany(fetch = FetchType.EAGER)
    private Collection<AppRole> roles = new ArrayList<>();


    @OneToMany(mappedBy = "appUser" )
    @Fetch(value = FetchMode.SUBSELECT)
    @JsonManagedReference(value="appuser-contrat")
    private Collection<Contrat> contrats = new ArrayList<Contrat>();



    public void addToContrats(Contrat contrat){
        this.contrats.add(contrat);
    }


}

Контраст Entity

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Contrat implements Serializable{

        @Id @GeneratedValue
        private Long id;
        private Date dateDebut ;
        private Date dateFin ;
        private Long idDevloppeur;
        @ManyToOne
        @JoinColumn(name = "Id_Project")
        @JsonBackReference(value="projet-contrat")
        private Project project;

        @ManyToOne
        @JoinColumn(name = "Id_AppUser")
        @JsonBackReference(value="appuser-contrat")
        private AppUser appUser;


}

Entity Project

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Project implements Serializable{

        @Id @GeneratedValue
        private long id;
        private String intitule;
        private String description;

        @OneToMany(mappedBy = "project" )
        @Fetch(value = FetchMode.SUBSELECT)
        @JsonManagedReference(value="projet-contrat")
        private Collection<Contrat> contrats  = new ArrayList<Contrat>();



        public void addToContrats(Contrat contrat){
                this.contrats.add(contrat);
        }



 }

1 Ответ

0 голосов
/ 05 июня 2018

(Публикация ответа для подведения итогов решения в комментариях)

В данном запросе выбора использовался «inner join u.contrats», но для пользователей не было объектов договора.Решение: замените на "left join u.contrats".

Внутреннее соединение против левого соединения уже решено здесь В чем разница между INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...