Hibernate 为关系实体编写HQL

Hibernate 为关系实体编写HQL,hibernate,entity,Hibernate,Entity,我正在struts 2.1中开发一个应用程序,对于数据库交互,我使用了hibernate,在我的注册屏幕中,用户将输入像firstname、lastname、address和city这样的内容,city是一个从数据库填充的下拉控件。因此,用户输入所有详细信息,并从下拉列表中选择城市,并提交表单,该表单实际上成功地将数据保存到用户表中。代码如下: 动作类 public class RegisterPartnerAction extends ActionSupport { private

我正在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);
 }
道层

 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";