【问题标题】:Writing HQL for the relationship entities为关系实体编写 HQL
【发布时间】:2014-01-13 08:17:00
【问题描述】:

我正在用 struts 2.1 开发一个应用程序,我使用 hibernate 进行数据库交互,在我的注册屏幕中,用户将输入名字、姓氏、地址和城市,城市是从数据库中填充的下拉控件。因此,用户输入所有详细信息并从下拉列表中选择城市并提交实际将数据成功保存到用户表中的表单。代码如下:

动作类

 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 链接。 现在我想获取特定用户以及城市详细信息,即城市名称、城市代码。我不明白如何为其编写 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>";

这不起作用。请任何人就这两个实体的关系方式向我提出建议。这对我有很大的帮助。

【问题讨论】:

  • 您不应该在一个实体(用户)中拥有另一个实体(city_id)的 ID。相反,您应该有一个 City 类型的字段,使用 @ManyToOne 注释映射。关联是 JPA/Hibernate 的一个关键特性,不使用它们会阻止您在 HQL 查询中使用连接。阅读文档。
  • 感谢您的帮助,但我的问题是城市是 GUI 中的下拉控件,当用户提交表单时,他选择了任何城市以及我在操作类中收到的内容,即 RegisterPartnerAction 是 city_id。您能否详细说明一下,如果我使用 @ManyToOne 映射,那么如何将 city_id 保存到我的用户表中
  • 使用session.find()session.load()查找给定ID的城市,并将其设置为用户所在的城市。

标签: hibernate entity


【解决方案1】:

如果你想正确加入你的用户类应该是这样的:

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

但由于 City 现在是 User 的一部分,因此仅获取 user 对象可能就足够了

from User ur join fetch ur.city 

where ur.user_id = :userId";

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多