Hibernate 为关系实体编写HQL
我正在struts 2.1中开发一个应用程序,对于数据库交互,我使用了hibernate,在我的注册屏幕中,用户将输入像firstname、lastname、address和city这样的内容,city是一个从数据库填充的下拉控件。因此,用户输入所有详细信息,并从下拉列表中选择城市,并提交表单,该表单实际上成功地将数据保存到用户表中。代码如下: 动作类Hibernate 为关系实体编写HQL,hibernate,entity,Hibernate,Entity,我正在struts 2.1中开发一个应用程序,对于数据库交互,我使用了hibernate,在我的注册屏幕中,用户将输入像firstname、lastname、address和city这样的内容,city是一个从数据库填充的下拉控件。因此,用户输入所有详细信息,并从下拉列表中选择城市,并提交表单,该表单实际上成功地将数据保存到用户表中。代码如下: 动作类 public class RegisterPartnerAction extends ActionSupport { private
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);
}
道层
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链接。
现在我想获取一个特定的用户以及City-detail-means-cityname,City\u代码。我不明白如何为它编写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>";
选择您的名字、姓氏、地址、cy.cityname、cy.city\u代码自“+
“用户ur,城市cy”+
“哪里”+
“ur.city\u id=cy.city\u id和”+
“ur.user_id=:”;
这不起作用。请任何人就这两个实体的关联方式向我提出建议。这将对我有很大帮助。如果您想正确加入,您的用户类应该如下所示:
public class User {
// ...
@ManyToOne
// @JoinColumn if necessary
private City city;
}
HQL应该是这样的:
但是,由于城市现在是用户的一部分,仅获取用户对象可能就足够了
您不应该在实体(用户)中拥有另一个实体(城市ID)的ID。相反,您应该有一个类型为City的字段,映射为@ManyTone注释。关联是JPA/Hibernate的一个关键功能,不使用它们会阻止您在HQL查询中使用联接。请阅读文档。感谢您的帮助,但我的问题是City是GUI中的下拉控件,当用户提交表单时,他会选择任何我在action类(即RegisterPartGeneration)中收到的是城市id。请详细说明如果我使用@manytone映射,那么如何将城市id保存到我的用户表中使用session.find()
或session.load()
查找具有给定id的城市,并将其设置为用户的城市。
select ur.firstname,/*..*/cy.cityname,cy.city_code
from User ur join fetch ur.city
where ur.user_id = :userId";
from User ur join fetch ur.city
where ur.user_id = :userId";