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

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

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

hibernate配置文件如下:

Product(截取了部分)

       
            
            
        

        
            
        

        
            
        

ProductType

       
            
            
        

        
            
        

        
            
            
        

现有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 list = (List)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(...)方法,在一个事物中完成相关属性的访问,虽然我没用,但是应该是可行的。

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

你可能感兴趣的:(java开发)