我正在开发struts 2.1中的应用程序和数据库交互我已经使用了hibernate,在我的注册屏幕中,用户将输入如firstname,lastname,address和city,city是一个从数据库中填充的下拉控件。因此,用户输入所有详细信息并从下拉列表中选择城市,并将实际成功保存数据的表单提交到用户表中。这是代码:
行动类
public class RegisterPartnerAction extends ActionSupport {
private String firstname
private String lastname;
private String address;
private int city_id;
//getter and setters firstname,lastname,address and city_id
//saves the object into db
User user = new User();
UserDao userDao = new UserDao();
user.setfirstname(getfirstname());
user.setlastname(getlastname());
user.setaddress(getaddress());
user.setCity_id(getCity_id());
userDao.SaveUser(user);
}
Dao Layer
public class UserDao
{
public void SaveUser(User user){
SessionFactory sessionFactory= HibernateManager.getSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
session.close();
}
}
用户实体
@Entity
@Table(name="user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id")
private int user_id;
@Column(name="firstname")
private String firstname;
@Column(name="lastname")
private String lastname;
@Column(name="address")
private String address;
@Column(name="city_id")
private int city_id;
// getter and setter
}
城市实体
@Entity
@Table(name="city")
public class City implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="city_id")
private int city_id;
@Column(name="cityname")
private String firstname;
@Column(name="city_code")
private String citycode;
// getter and setter
}
直到将数据保存到用户表中就可以了。现在,如果您将看到用户表或实体与city_id链接。 现在我想要获取特定用户以及城市详细信息表示cityname,city_code。我不明白如何为它编写HQL
我尝试使用以下HQL
select ur.firstname,ur.lastname,ur.address,cy.cityname,cy.city_code from " +
"User ur,City cy" +
"where " +
"ur.city_id=cy.city_id and" +
"ur.user_id=:<some_hardcoded_id>";
这不起作用。请有人建议我关于这两个实体的关系方式。这对我很有帮助。
答案 0 :(得分:0)
如果您想要正确加入,您的User类应如下所示:
public class User {
// ...
@ManyToOne
// @JoinColumn if necessary
private City city;
}
public class User {
// ...
@ManyToOne
// @JoinColumn if necessary
private City city;
}
HQL应该看起来像这样:
select ur.firstname,/*..*/cy.cityname,cy.city_code
from User ur join fetch ur.city
where ur.user_id = :userId";
但由于纽约市现在是用户的一部分,因此仅提取用户对象可能就足够了
select ur.firstname,/*..*/cy.cityname,cy.city_code
from User ur join fetch ur.city
where ur.user_id = :userId";