我想在hibernate状态查询两个表。用户实体中的featch 3表(User-Role-Profile)。用hql查询:
query= "select ue, ue.roleEntity.roleId from UserEntity ue ,RoleEntity re fetch all properties where ue.roleEntity.roleId=re.roleId and ue.username ='reza' and ue.password='123456'";
并运行查询:
try { sessionFactory = HibernateUtil.getSessionFactory(); session = sessionFactory.getCurrentSession(); transaction = session.beginTransaction(); userEntityList = (List<UserEntity>) session.createQuery(query).list(); transaction.commit(); } catch (HibernateException e) { try { throw new DaoException("Fetal exception in", e); } catch (DaoException e1) { e1.printStackTrace(); } }
userentity类:此类是geteer和seter:
public class UserEntity { private int userId; private long personalCode; private String username; private String password; private short active; private String question; private String passive; private ProfileEntity profileEntity; private RoleEntity roleEntity;
userEntity.hbm.xml的hibernate映射
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="entity"> <class name="UserEntity" table="TABLE_USER"> <id name="userId" type="java.lang.Integer" column="USER_ID"> <generator class="increment" /> </id> <property name="personalCode" type="java.lang.Long" column="PERSONALCODE"> </property> <property name="username" type="java.lang.String" column="USERNAME"> </property> <property name="password" type="java.lang.String" column="PASSWORD"> </property> <property name="active" type="java.lang.Short" column="ACTIVE"> </property> <property name="question" type="java.lang.String" column="QUCTION"> </property> <property name="passive" type="java.lang.String" column="PASSIVE"> </property> <many-to-one name="roleEntity" class="entity.RoleEntity" column="ROLE_ID" cascade="none" fetch="select" /> <many-to-one name="profileEntity" class="ProfileEntity" cascade="delete" column="profile_id"/> </class> </hibernate-mapping>
和类hibernateutil创建会话:
import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; static { try { Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); sessionFactory = configuration.buildSessionFactory(builder.build()); } catch (Throwable th) { System.err.println("Enitial SessionFactory creation failed" + th); throw new ExceptionInInitializerError(th); } } /** * @return */ public static SessionFactory getSessionFactory() { return sessionFactory; } }
由于使用的是多选投影,因此实际上是在获取对象数组,因此需要将查询结果处理逻辑更改为:
List<Object[]> tuples = (List<Object[]>) session.createQuery(query).list(); for(Object[] tuple : tuples) { UserEntity ue = tuple[0]; Number roleId = tuple[1]; }