2014-11-20 3 views
0

Альбом, Жанр, Пользовательские классы, как показано ниже. пользовательский класс имеет userId. Я хочу перечислить все песни, принадлежащие определенному пользователю. Для этого я использовал этот запрос:Как выполнить внутреннее соединение 3 класса в спящем режиме

String hql = "select song.title,song.artist,song.rating,song.composer,album.albumName,genre.genreName from model.Song song"+ 
        "inner join song.Album as album"+ 
        "inner join song.Genre as genre"+ 
        "inner join model.Login login"+ 
        "where login.userId= :userId"; 

Альбом и Жанр сопоставляются песни class.I ам не ясно, о том, как связать класс песни и Войти класс.

@Entity 
@Table(name = "songs") 
public class Song implements Serializable { 


@Id 
@GeneratedValue 
@Column(name = "song_id") 
private int songId; 

@OneToOne(cascade=CascadeType.ALL) 
@JoinTable(name = "albums_songs_mapping", joinColumns = @JoinColumn(name = "song_id", referencedColumnName = "song_id"), inverseJoinColumns = @JoinColumn(name = "album_id", referencedColumnName = "album_id")) 
private Album album; 

@Column(name = "title", nullable = false) 
private String title; 

@Column(name = "rating") 
private int rating; 

@Column(name = "artists") 
private String artist; 

@Column(name = "composer") 
private String composer; 

@OneToOne(cascade=CascadeType.ALL) 
@JoinTable(name = "genre_songs_mapping", joinColumns = @JoinColumn(name = "song_id",  
referencedColumnName = "song_id"), inverseJoinColumns = @JoinColumn(name = "genre_id", 
referencedColumnName = "genre_id")) 
private Genre genre; 
//getters and setters 
} 

@Entity 
@Table(name = "albums") 
public class Album { 

@Id 
@GeneratedValue 
@Column(name = "album_id") 
private int albumId; 

@Column(name = "album_name", length = 250) 
private String albumName; 

@OneToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "albums_songs_mapping", joinColumns = @JoinColumn(name = "album_id", 
referencedColumnName = "album_id"), inverseJoinColumns = @JoinColumn(name = "song_id", 
referencedColumnName = "song_id")) 
private List<Song> songs; 

//getters and setters 
} 


@Entity 
@Table(name = "genre") 
public class Genre { 

@Id 
@GeneratedValue 
@Column(name = "genre_id") 
private int genreId; 

@Column(name = "genre_name", length = 250) 
private String genreName; 

@OneToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "genre_songs_mapping", joinColumns = @JoinColumn(name = "genre_id", 
referencedColumnName = "genre_id"), inverseJoinColumns = @JoinColumn(name = "song_id", 
referencedColumnName = "song_id")) 
private List<Song> songs; 
//getters and setters 
} 

@Entity 
@Table(name = "login", uniqueConstraints = {@UniqueConstraint(columnNames = 
{"user_name"})}) 
public class Login { 

@Id 
@GeneratedValue 
@Column(name = "user_id") 
private int userId; 

@Column(name = "user_name", nullable=false) 
private String userName; 

@Column(name = "password", nullable=false) 
private String password; 

@ManyToMany 
@JoinTable(name = "user_songs_mapping", joinColumns = @JoinColumn(name = " user_id", 
referencedColumnName = "user_id"), inverseJoinColumns = @JoinColumn(name = "song_id", 
referencedColumnName = "song_id")) 
private List<Song> songs; 
//getters and setters 
} 
+0

Что вы используете на самом деле, 'HQL' или' API критериев ' –

+0

Я использую hql. session.createQuery (hql) – kumuda

ответ

3

Это проще, если вы начинаете с Login. Попробуйте следующее:

String hql = "select song.title, song.artist, song.rating, song.composer, album.albumName, genre.genreName " 
    + "from Login l join l.songs song " 
    + "join song.genre genre " 
    + "join song.album album " 
    + "where l.userId= :userId"; 
+0

Привет, спасибо. Я получаю объекты из базы данных, но я получаю исключение класса, когда я пытаюсь использовать их в списке . java.lang.ClassCastException: [Ljava.lang.Object; не может быть добавлено в java.util.List – kumuda

+0

@kumuda Это потому, что вы возвращаете список отдельных полей из разных объектов. Если вы хотите, чтобы 'List ' был возвращен, просто измените предложение 'select' в запросе на' select song from ... ' –

+0

Привет, предра. Я изменил свое HQL к Строка HQL = "выберите песню" + "из Логина л присоединиться l.songs песни" \t \t \t \t + "присоединиться song.genre жанр" + "присоединиться song.album альбома" \t \t \t \t + "где l.userId =: userId"; \t \t Запрос запроса = session.createQuery (hql); \t \t query.setParameter ("userId", userId); \t \t для (итератор это = query.iterate(); it.hasNext();) { \t \t \t песен = (Список ) it.next(); \t \t} Но я все еще получаю исключение класса. java.lang.ClassCastException: model.Song нельзя отнести к java.util.List – kumuda

Смежные вопросы