代码写到一半突然想看看 HQL 是怎样 为这些占位符传参的,所以花了几分钟debug 看了一下
对于Hql 语句中占位符对应的参数的顺序是物理逻辑上的,还是逻辑顺序上的?
所谓的物理逻辑,也就是它们出现的顺序
List<String>productIdList = findHql(
"SELECT idFROM ProductEntity WHERE productCategoryId = ? AND id IN"
+ "(SELECTproductId FROMProductFilterItemRelEntity WHERE filterItemId=? AND filterItemValue=?)",
pd_product_category_id,fieldStr,dataStr);
1 pd_product_category_id
2 fieldStr
3 dataStr
换一下位置之后
1 fieldStr
2 dataStr
3 pd_product_category_id
如果是按照逻辑顺序的话,就应该是这样的顺序
首先,拿到pd_product_category_id 值为 41
fieldStr 值为0000001
dataStr 值为1-filter1
查找到的对象列表为空。
换回物理顺序之后,对象值不为空,大小为 1
实际上,Hibernate 将参数放入Object数组中,对应的占位符的顺序匹配成Hql 然后再执行语句。
总结:Hql 语句的传参顺序并非按照逻辑顺序,而是按照物理顺序去匹配的。