2015-07-10 4 views
3

Я разрабатываю веб-приложение, использующее спящий режим.Как присоединиться к нескольким таблицам в спящем режиме

То же самое приложение, я создал в JSP сервлет, но теперь я использую spring и hibernate, но не в состоянии сделать то же самое, которое я сделал с помощью jsp/servlet

код Jsp

String sql = "select city from addres_table where id=2"; 
Statement st = con.createStatement(); 
ResultSet rs = st.executeQuery(sql); 
while(rs.next()){ 
String city = rs.getString("city"); 
String sql1 = "select name from user_table where city='"+city+"'"; 
Statement st1 = con.createStatement(); 
ResultSet rs1 = st1.executeQuery(sql1); 
while(rs1.next()){ 
String username = rs.getString("name"); 
} 
} 

В основном я выборка city от addres_table сейчас я получаю name из users, проживающих в этом city с User_table.

То же самое, что я хочу сделать в спящем режиме, но я не могу это сделать.

Я достал city от addres_table, но теперь, как я могу получить name от User_table используя этот город.

Вот мой зимуют код

@SuppressWarnings({ "unchecked", "rawtypes" }) 
public List<Address> getProfessionById(long id) throws Exception { 
session = sessionFactory.openSession(); 
Criteria cr = session.createCriteria(Address.class); 
cr.add(Restrictions.eq("uid", id)); 
List results = cr.list(); 
tx = session.getTransaction(); 
session.beginTransaction(); 
tx.commit(); 
return results; 
} 

Пожалуйста, помогите мне, я хочу, чтобы извлечь имя из User_table используя этот город

Адрес класса

@Entity 
@Table(name="user_profession") 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class Address implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue 
@Column(name="id") 
private long id; 

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

public long getId() { 
    return id; 
} 


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

public String getCity() { 
    return city; 
} 

    public void setCity(String city) { 
    this.city = city; 
} 
} 

класс пользователя

@Entity 
@Table(name="user_table") 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class User implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue 
@Column(name="id") 
private long id; 

@Column(name="full_name") 
private String fullName; 

public long getId() { 
    return id; 
} 
public void setId(long id) { 
    this.id = id; 
} 

public String getFullName() { 
    return fullName; 
} 
public void setFullName(String fullName) { 
    this.fullName = fullName; 
} 
} 
+1

Привет, это должно быть легко, но перед тем, как помочь, вы также можете обновить свои сопоставления? Как класс USER и Address, или его hbm-файл, если он есть. –

+0

Hibernate сам создает инструкцию SQLselect, создавая соединения и возвращающую желаемый результат, как указано в вашей конфигурации xml. –

+0

ниже - мой класс Address и класс пользователя –

ответ

1

Прежде всего, вы должны сопоставить отношения между двумя субъектами, изменить классы, как это:

Адрес Класс: Класс

@Entity 
@Table(name="user_profession") 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class Address implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue 
    @Column(name="id") 
    private long id; 

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

    //Map the users here 
    @OneToMany(mappedBy="adress") 
    private Set<User> users; 
    //getter and setter 

    public long getId() { 
     return id; 
    } 


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

    public String getCity() { 
     return city; 
    } 

    public void setCity(String city) { 
     this.city = city; 
    } 
} 

Пользователь:

@Entity 
@Table(name="user_table") 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue 
    @Column(name="id") 
    private long id; 

    @Column(name="full_name") 
    private String fullName; 

    //The Adress mapping here 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name = "Adress_ID", referencedColumnName = "id") 
    private Address address; 

    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
    this.id = id; 
    } 

    public String getFullName() { 
     return fullName; 
    } 
    public void setFullName(String fullName) { 
     this.fullName = fullName; 
    } 
} 

И затем, чтобы получить список пользователей в определенном городе, выполните следующие действия:

String hql = "SELECT user.name FROM USER_TABLE user WHERE user.address IN (SELECT address FROM ADDRESS_TABLE address WHERE address.id = :id)"; 
Query query = session.createQuery(hql); 
query.setParameter("id",2); 
List results = query.list(); 

EDIT:

Используйте этот запрос вместо:

String hql = "from User u INNER JOIN u.address ad where ad.id = :id"; 
Query query = session.createQuery(hql); 
query.setParameter("id",2); 
List results = query.list(); 

И вы получите то, что вам нужно.

+0

Что такое ADRESS_ID в @joincolumn? –

+0

Это имя внешнего ключа, который будет храниться в 'USER_TABLE'. –

+0

не работает broo :( –