2017-10-04 1 views
0

Ich versuche, zwei Tabellen zu verbinden und das Ergebnis anzuzeigen, indem Sie Federdaten JPA eins zu eins Verbindung verwenden. Im Folgenden werde ich mein Modell und Repository-Klassen am Hinzufügen, Mein erstes Modellklasse Benutzer ist,Feder Daten jpa Tabellen Beitritt von eins zu eins Association

@Entity 
@Table(name = "users") 

public class Users implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer id; 

@Column(name = "username") 
public String username; 

@Column(name = "password") 
public String password; 

@Column(name = "privid") 
public Integer privid; 

@OneToOne() 
@JoinColumn(name="join_privillage") 
private Privillages priviJoin; 


public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public Integer getPrivid() { 
    return privid; 
} 

public void setPrivid(Integer privid) { 
    this.privid = privid; 
} 

public Privillages getPriviJoin() { 
    return priviJoin; 
} 

public void setPriviJoin(Privillages priviJoin) { 
    this.priviJoin = priviJoin; 
} 



protected Users() { 
} 

public Users(String username, String password, Integer privid) { 
    this.username = username; 
    this.password = password; 
    this.privid = privid; 
} 
@Override 
public String toString() { 
    return String.format("Users[id=%d, username='%s', password='%s']", id, 
username, password); 
} 
} 

Und meine nächste Modellklasse, die ich anschließen müssen, ist:

@Entity 
@Table(name = "privillages") 
public class Privillages implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
public Integer id; 

@Column(name = "privid") 
public Integer privid; 

@Column(name = "privi_name") 
public String privi_name; 

@OneToOne(fetch=FetchType.LAZY, mappedBy="priviJoin") 
public Users user; 


public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public Integer getPrivid() { 
    return privid; 
} 

public void setPrivid(Integer privid) { 
    this.privid = privid; 
} 

public String getPrivi_name() { 
    return privi_name; 
} 

public void setPrivi_name(String privi_name) { 
    this.privi_name = privi_name; 
} 

public Users getUser() { 
    return user; 
} 

public void setUser(Users user) { 
    this.user = user; 
} 

public Privillages() { 
} 

public Privillages(Integer privid, String privi_name) { 
    this.privid = privid; 
    this.privi_name = privi_name; 

} 
} 

Und mein Repository ist:

public interface UsersRepository extends CrudRepository<Users, Integer> { 

@Query("SELECT u.username FROM Users u inner join p.privi_name FROM 
Privillages p") 
List<Users> findByUsername(); 
} 

Und wenn ich laufende Anwendung, seine hows der Fehler wie

"Unerwartetes Token: FROM nahe Zeile 1, Spalte 74 [SELECT u.username FROM com.central.model.Users u innere Verbindung p.privi_name FROM com.central.model.Privillages p]".

Und

"Validierung fehlgeschlagen für die Suche nach für die Methode public abstract java.util.List com.central.repository.UsersRepository.findByUsername()".

Antwort

1
  • Du einen Vorsprung in der Abfrage verwenden, aber eine ganze Einheit als Ergebnis erwarten.
  • Auch Sie sind falsch beitreten und Datenbank-Spaltennamen anstelle von zugeordneten Feldnamen verwenden.
  • Sie sind von zweimal mit ..

Wenn Sie die gesamte Einheit als Ergebnis und das Privileg bereits geholt zusammen mit Benutzer haben wollen, dann versuchen:

@Query("SELECT u FROM Users u inner join fetch u.priviJoin") 

aktualisieren

Wenn Sie die Projektion verwenden möchten, müssen Sie den Ergebnistyp ändern:

@Query("SELECT u.username,p.privi_name FROM Users u inner join u.priviJoin p") 
List<Object[]> findByUsername(); 

brauchen Sie in diesem Fall auch nicht fetch.

+0

Ich verwende diese Abfrage mit ID als Bedingung. Mit der Anzeige von Benutzername und priv_name. Ich habe die Abfrage jetzt so geändert. "@ Query (" SELECT u.Benutzername, p.privi_name FROM Benutzer u innerer Join Privilegien p ON u.id = p.id ")" .But immer noch Fehler angezeigt "Pfad für Join erwartet! ". – Jacob

+0

Auch mein Fremdschlüssel-Constraint liegt auf beiden Tabellen. – Jacob

+1

Jetzt mit dem Update versuchen –

Verwandte Themen