hibernate left join 多表连接查询不到结果,但生成的查询语句在数据库可以查询

来源:互联网 发布:什么是网络pos机 编辑:程序博客网 时间:2024/05/17 06:12

这两天用到了SSH,被一个奇怪的问题纠结了好久,具体问题描述如下:

有两个表:Product 表和 ProductType,Product表中的类型字段引用了ProductType表的Id

hibernate配置文件如下:

Product(截取了部分)

        <id name="giftId" type="integer">
            <column name="_id"/>
            <generator class="native" />
        </id>
        <property name="giftName" type="string">
            <column name="_giftName"/>
        </property>
        <many-to-one name="giftType" class="com.wishes.www.model.ProductType" unique="true" cascade="all">
            <column name="_giftType"/>
        </many-to-one>

ProductType

        <id name="typeId" type="integer">
            <column name="_id"/>
            <generator class="native" />
        </id>
        <property name="typeName" type="string">
            <column name="_typeName"/>
        </property>
         <set name="products" inverse="true" cascade="all">
             <key column="_id"></key>
             <one-to-many class="com.wishes.www.model.Product"/>
         </set>

现有SQL语句:String sql = select new Product(pro.giftId,pro.giftName,pro.giftSalePrice,pro.giftDiscount,pro.giftDiscribe)from Product as pro left join pro.giftType as tttt where pro.status = 1 and tttt.typName = "+typeName+"";(typeName为传入参数 '儿童玩具' )

List<Product> list = (List<Product>)ht.find(sql);

问题:这样是查询不到结果的,返回list.size() = 0,但是将控制台打印的语句复制到mysql查询工具是可以查询到的。

分析原因(个人理解,有可能不正确,呵呵):hibernate内部实现默认为lazy=true加载,被关联到的表,也就是Product对象引用到的ProductType对象的数据是不被加载的,除非在单个查询的session中显示的调用了ProductType对象的某个属性方法取值(但是ProductType的主键,也就是Product的外键是会加载的)。

解决方法:用主键来作为查询条件,也就是 String sql = select new Product(pro.giftId,pro.giftName,pro.giftSalePrice,pro.giftDiscount,pro.giftDiscribe)from Product as pro left join pro.giftType as tttt where pro.status = 1 and tttt.typName = "+typeId+"";(typeId为传入参数 '1' )

这样就能查询出结果了!!!!

其他认为可行的方法:重写HibernateTemplate.executeFind(...)方法,在一个事物中完成相关属性的访问,虽然我没用,但是应该是可行的。

希望对有需要的人有帮助,多多交流!!!

原创粉丝点击