一、类
2个Bean:Users和 UsersLogin 通过userId关联
public class Users implements Serializable{
private Long userId;//用户编号
private String phoneIMEI;
private String createMan;
private String createDate;
//省略getter,setter
}
public class UsersLogin implements Serializable {
private Long ID; //id
//private Integer userId; //用户编号
private String userName; //用户名
private String password;//用户密码
private String lastLoginDate;//上次登陆时间
private Users users;
//省略getter,setter
}
二、映射文件
Users.hbm.xml:
<hibernate-mapping package="com.bean">
<class name="Users" table="Users">
<id name="userId" column="userId" type="java.lang.Long">
<generator class="hilo">
<param name="table">hibernate_unique_keys</param>
<param name="column">userId_next_hi</param>
<param name="max_lo">100</param>
</generator>
</id>
<!-- 属性 -->
<property name="phoneIMEI" column="phoneIMEI"></property>
<property name="createMan" column="createMan"></property>
<property name="createDate" column="createDate"></property>
</class>
</hibernate-mapping>
UsersLogin.hbm.xml
<hibernate-mapping package="com.bean">
<class name="UsersLogin" table="UsersLogin">
<id name="ID" column="ID" type="java.lang.Long">
<generator class="identity">
</generator>
</id>
<property name="userName" column="userName"></property>
<property name="password" column="password"></property>
<property name="createDate" column="createDate"></property>
<property name="lastLoginDate" column="lastLoginDate"></property>
<many-to-one name="users" column="userId" unique="true">
</many-to-one>
</class>
</hibernate-mapping>
三、表结构(SQL 2005)
CREATE TABLE [dbo].[Users](
[userId] [int] NOT NULL,
[phoneIMEI] [varchar](50) NULL,
[createDate] [datetime] NULL,
[createMan] [varchar](30) NULL,
CONSTRAINT [PK_USERS] PRIMARY KEY CLUSTERED
(
[userId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[UsersLogin](
[ID] [int] NOT NULL,
[userId] [int] NOT NULL,
[userName] [varchar](30) NULL,
[password] [varchar](30) NULL,
[createDate] [datetime] NULL,
[lastLoginDate] [datetime] NULL,
CONSTRAINT [PK_USERSLOGIN] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
四、HQL语句
public UsersLogin checkUserLogin(String phoneIMEI, String userName,
String password) {
String hql="from UsersLogin u left join u.users s where userName=:userName and password=:password and s.phoneIMEI=:phoneIMEI";
Query query =this.getHibernateTemplate().getSessionFactory().openSession().createQuery(hql);
query.setString("userName", userName);
query.setString("password", password);
query.setString("phoneIMEI", phoneIMEI);
UsersLogin ul =null;
List list =query.list();
if(list.size()>0){
Object[] arr=(Object[])list.get(0);
ul=(UsersLogin)arr[0];
}
return ul;
}
说明:
String hql="from UsersLogin u left join u.users s where userName=:userName and password=:password and s.phoneIMEI=:phoneIMEI";
通过这个HQL语句查询出来
List list =query.list();
list中其实有2个对象第1个对象为UsersLogin类型的,第2个为Users类型的
所以通过 UsersLogin ul =(UsersLogin)list.get(0) 会报类型转换错误,
而这里我需要返回的是UsersLogin类型的对象,这个对象中包括了关联的Users对象相关的数据(因为在UsersLogin类中声明了一个Users类型的属性)
还有一种方式:
使用下面的HQL语句查询:
String hql="select u from UsersLogin u left join u.users s where userName=:userName and password=:password and s.phoneIMEI=:phoneIMEI";
这个方式查询出来List list =query.list();
list中就只有一个对象,对象类型为UsersLogin;
这个对象中的users属性下没有任何数据(即没有把Users表中的数据关联到这个对象下的Users中),
很奇怪(这里希望有知道原因的高手指点一下)