2016-04-12 3 views
0

Ich habe Probleme mit Join mit QUeryDSL. Ich versuche, eine Liste von "Clube" zu erhalten, die eine ManyToOne-Beziehung mit "Federacao" hat.Fehler beim Verbinden einer Relation ManyToOne. Verwenden von QueryDSL

Kann mir jemand helfen?

Danke.

Die Beziehung ist zwischen den folgenden Klassen.

@Entity 
@Table(name = "federacoes") 
@SequenceGenerator(name = "idgen", sequenceName = "federacoes_id_federacao_seq", allocationSize = 1) 
@AttributeOverride(name = "id", column = @Column(name = "id_federacao")) 
public class Federacao extends AbstractEntity{ 

private String sigla; 
private String uf; 
private String nome; 
... 
} 

@Entity 
@Table(name = "clubes") 
@SequenceGenerator(name = "idgen", sequenceName = "clubes_id_clube_seq", allocationSize = 1) 
@AttributeOverride(name = "id", column = @Column(name = "id_clube")) 
public class Clube extends AbstractEntity{ 

private Federacao federacao; 
... 

@ManyToOne 
@JoinColumn(name = "id_federacao") 
@Column(name = "federacao") 
public Federacao getFederacao() { 
    return federacao; 
} 
... 
} 

Ich verwende QueryDSL und im Repository-Klasse, die QueryDslRepositorySupport erstreckt ich tue dies:

... 
@PersistenceContext 
private EntityManager em; 

private static final QClube qClube = QClube.clube; 
private static final QFederacao qFederacao = QFederacao.federacao; 

@Override 
public List<Clube> findAll(FilterClubeDTO filterClubeDTO) { 

JPAQuery query = new JPAQuery(em); 
    return query.from(qClube) 
     .innerJoin(qFederacao).on(qClube.federacao.eq(qFederacao)) 
    .orderBy(qClube.id.desc()) 
    .list(qClube); 

} 

Ich erhalte diese Ausnahme:

2016-04-12 12:32:38.485 ERROR 2853 --- [ qtp36627152-15] o.h.hql.internal.ast.ErrorCounter  : Path expected for join! 


org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [select clube 
from br.com.cbfm.core.models.Clube clube 
inner join Federacao federacao with clube.federacao = federacao 
order by clube.id desc]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [select clube 
from br.com.cbfm.core.models.Clube clube 
inner join Federacao federacao with clube.federacao = federacao 
order by clube.id desc] 
+0

Versuchen mit Entfernen der '@ Column' Anmerkung aus: ' @ManyToOne @JoinColumn (name = "id_federacao") @Column (name = "Federacao") öffentlichen Federacao getFederacao() { return Federacao; } ' Und halten Sie es wie folgt aus: ' @ManyToOne @JoinColumn (name = "id_federacao") öffentlichen Federacao getFederacao() { return Federacao; } ' –

Antwort

0

Diese Arbeit sollte wie erwartet:

JPAQuery query = new JPAQuery(em); 
    return query.from(qClube) 
     .innerJoin(qClube.federacao, qFederacao) 
    .orderBy(qClube.id.desc()) 
    .list(qClube); 
+0

Hey Meiko. Vielen Dank für Ihre Antwort.Leider habe ich es vorher versucht. Ich habe diese Ausnahme. Verursacht durch: java.lang.NullPointerException: null \t bei org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement (HqlSqlWalker.java:408) \t bei org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement (HqlSqlBaseWalker.java:3903) \t bei org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement (HqlSqlBaseWalker.java:3689) \t bei org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList (HqlSqlBaseWalker.java: 3567) –

+0

in Ihrer Frage, die Sie geschrieben haben: ... "Clube", die eine ManyToOne-Beziehung mit "Federacao" hat .... Aber ich kann keine "ManyToOne" -Anmerkung sehen ... nur ein 'OneToOne' –

+0

Tut mir leid @Meiko. Ich habe gerade getestet, aber ich habe das gleiche Problem in ManyToOne und OneToOne. Ich korrigiere nur die Frage. –

0

Die Anfrage von Meiko ist richtig. Ich habe Ihr Projekt heruntergeladen und einige Probleme mit den Beziehungen der Modelle gefunden.

Sie den folgenden Code nicht verwenden,

@ManyToOne 
@JoinColumn(name = "id_federacao") 
@Column(name = "federacao") 
public Federacao getFederacao() { 
    return federacao; 
} 

Aber Gebrauch

@ManyToOne 
@JoinColumn(name = "federacao") 
private Federacao federacao; 
  • Verwenden Sie den Namen "Federacao" statt "id_federacao", weil die Spalte, die Sie anschließen möchten, ist clubes .federacao und nicht clube.id_federacao.
  • Sie können @Column nicht mit @ManyToOne verwenden.

Das sollte lösen Sie sind ein Problem. Ich habe auch ein paar Kleinigkeiten geändert, aber das sollte den Code nicht beeinflussen.

+0

Danke Mann. Ich habe gerade gelöst. –

0

Das Problem war in meiner Zuordnung. Ich reparierte es einfach, es zu tun:

Klasse Clube

@ManyToOne 
@JoinColumn(name="id_federacao", nullable=false) 
private Federacao federacao; 

und Klasse Federacao

@OneToMany(mappedBy="federacao") 
private Set<Clube> clubes; 

Ich habe jetzt ein anderes Problem, das ich jetzt schreiben werde.

Danke an alle.

Verwandte Themen