为关系实体编写HQL

时间:2014-01-13 08:17:01

标签: hibernate entity

我正在开发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>";

这不起作用。请有人建议我关于这两个实体的关系方式。这对我很有帮助。

1 个答案:

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