Kamel Mili
Kamel Mili

Reputation: 1434

Hibernate illegal attempt to dereference collection

hey everyone i have a spring boot app am trying execute a query but am getting this error

illegal attempt to dereference collection [dev0_."IdDev".vehid] with element property reference [marque] [SELECT DISTINCT d FROM com.ardia.MDValidation.entities.Dev d Left Join d.validationdvd v WHERE d.etatdev.id = 6 AND d.vehid.marque.Nommarque= ?] 

here's my Dev Class

@Entity
@Table(name="\"DEV\"")
public class Dev {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@JsonView(View.databymaj.class)
@Column(name="\"IdDev\"")
private int id ;

@JsonView(View.databymaj.class)
@Column(name="\"NomDev\"")
private String nomdev;

@Column(name="\"NomDLL\"")
private String dll ;


@ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name="\"IdEtatDev\"")
private EtatDev etatdev ;

@JsonView(View.databymaj.class)
@ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name="\"IdEcu\"")
private Ecu ecu ; 


@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="\"VEH_BY_DEV\""
        ,joinColumns={@JoinColumn(name="\"IdDev\"")}, 
        inverseJoinColumns={@JoinColumn(name="\"GRPMOD\"")})


private Set<Vehid> vehid = new HashSet<>();




@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="\"IdMaj\"")
private Maj maj ; 


@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="\"FCT_BY_DEV\""
                    ,joinColumns={@JoinColumn(name="\"IdDev\"")}, 
inverseJoinColumns={@JoinColumn(name="\"IdFonction\"")})
private Set<Fonction> fonction = new HashSet<>();

@JsonView(View.databymaj.class)
@OneToMany(fetch=FetchType.EAGER,mappedBy="dev")
private Set<ValidationDVD> validationdvd =new HashSet<> () ;

here's my Vehid class

@Entity
@Table(name="\"Vehid\"")
public class Vehid {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="\"CODE_VEH\"")
private int idv ;
@JsonView(View.model.class)
@Column(name="\"NOMVEH\"")
private String model ;

@ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name="\"IdMarque\"")
private Marque marque ;

and finaly the Marque class :

@Entity
@Table(name="\"Marque\"")
public class Marque {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="\"CODMAR\"")
private  int id ;
@JsonView(View.marqonly.class)
@Column(name="\"NOMMAR\"")
private String Nommarque ;

am trying to execute this query

  @Query(value="SELECT DISTINCT d FROM Dev d Left Join d.validationdvd v WHERE d.etatdev.id = 6 AND d.vehid.marque.Nommarque= ?")
  public List getbymarkalldata(String mark);

but it not seem to work and actually it make sens how it doesn't work because am trying to access a list of <vehid> like this d.vehid but how can i access to the attribute any help will be appreciated

Upvotes: 3

Views: 5972

Answers (2)

Kamel Mili
Kamel Mili

Reputation: 1434

I found the Solution just like he say's another Join was missing here's the syntax

@Query(value="SELECT DISTINCT d FROM Dev d Left Join d.validationdvd v JOIN d.vehid vs  WHERE d.etatdev.id = 6 AND vs.marque.Nommarque= ?")
 public List getbymarkalldata(String mark);

Upvotes: 1

Pras
Pras

Reputation: 1098

The problem is here : AND d.vehid.marque.Nommarque= ? In your Dev class, vehid is a collection ... you cannot reference it in a query that way ... you have to use JOIN keyword ... Just like what you did with validationdvd : Left Join d.validationdvd v

Left Joinor not, is up to you to decide ...

Upvotes: 5

Related Questions