2016-07-28 11 views
0

So habe ich ein ziemlich einfaches Schema und ich versuche * Artikel zu wählen, denen der Benutzer folgt.Hibernate-Unterabfrage in manytomany Join-Spalte funktioniert nicht wie erwartet

  1. Benutzer

Benutzer können andere Benutzer folgen

@Id 
@GeneratedValue(strategy= GenerationType.IDENTITY) 
@Column(name="userId") 
private int userId; 
@JsonIgnore 
@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "user_followers", 
     joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "following_id")}) 
    private Set<User> following = new HashSet<User>(); 
  1. Artikel

Ein Artikel enthält Informationen Artikel + eine ManyToOne Benutzerfeld:

@Entity 
@Table(name="entry") 
public class Article implements Serializable { 
@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "user_id", nullable = false) 
private User userId; 

@Column(name="articleInfo") 
private String articleInfo 

Dies ist die Abfrage Ich versuche zu laufen * Artikel auszuwählen -> Nun ist diese Abfrage wird nur Artikel auswählen, die bestimmte :user gemacht hat (der Benutzer whos die Daten anfordert).

Query q = sess.createQuery("from Article a where a.userId IN (from a.userId.following uf where uf.userId " + 
       "= :user)"); 

q.setParameter("user", u.getUserId()); 

Aber wenn ich versuche, und wählen Sie nur die uf.followingId es löst eine Ausnahme sagen, es ist das Feld followingId existiert nicht ?! Wie hier zu sehen ->

{@JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "following_id")}) 

können Sie sehen, dass ist die User_id (Benutzer, der folgt -> following_id) hat und follower_id (Benutzer, der gefolgt wird).

Ich verstehe nicht, warum Ich kannuf.userIdtun und nichtuf.followingId (Ich habe auch versucht, uf.following_id).

Query q = sess.createQuery("from Article a where a.userId IN (select uf.followingId from a.userId.following uf where uf.userId " + 
        "= :user)"); 
q.setParameter("user", u.getUserId()); 

Wirft den folgenden Fehler:

org.hibernate.QueryException: could not resolve property: followingId of: com.spring.models.db.user.User 

Antwort

0
@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "user_followers", 
     joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "following_id")}) 
    private Set<User> following = new HashSet<User>(); 

IN obigen Code wie ich sehe, dass Sie HQL verwenden und die Eigenschaft „folgende“ ist ein Satz, der mit einem Zwischentisch gehört. Es ist weder eine direkte Variable des Entity Users noch ein Fremdschlüssel. Deshalb erhalten Sie über Ausnahme. In HQL müssen Sie die Join-Abfrage explizit auslösen, um Details von JoinTable zu erhalten.

Verwandte Themen