Hibernate 一对一关系中的联接查询

一、类

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中),

很奇怪(这里希望有知道原因的高手指点一下)




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值