栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么Hibernate内联传递给JPA Criteria Query的Integer参数列表?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么Hibernate内联传递给JPA Criteria Query的Integer参数列表?

为什么不绑定字符串而不绑定数字文字?

应该始终对字符串进行参数绑定(而不是将文字放入查询中),以避免SQL注入。

但是,真正的问题是,为什么将文字直接插入查询中而不使用绑定。最初的原因是:

因此,导致我在此处使用文字的问题与规模和运算有关。含义(再次,iirc)一些数据库需要知道类型信息才能正确处理诸如…
+?…,等等。因此,选择是将所有此类参数包装在CAST函数调用中,并希望/祈祷数据库实现了正确的CAST函数或使用文字。最后,我选择了原义路线,因为那是用户预先要求的。包装函数调用将限制数据库利用很多数据库中索引的能力。

哪个对数据库更好?

它取决于数据库和查询,可能不会有很大的不同。例如,Oracle仅在值是文字时才可以进行某些分区,而其他数据库仅在值是绑定参数时才可以进行某些优化。如果它成为问题(例如,您对其进行了分析,并且知道那是使您放慢速度的原因),则只需切换到其他方法即可。

这在JPA规范中吗?

没有。

这与in语句中允许的值数有关吗?

没有。

我可以使用数字文字范围来代替直接插入查询吗

是的,但是有点冗长。

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();CriteriaQuery<Foo> query = cb.createQuery(Foo.class);Root<Foo> root = query.from(Foo.class);Parameterexpression<Long> paramOne = cb.parameter(Long.class);Predicate versionPredicate = root.get("bar").in(paramOne);query.select(root).where(versionPredicate);TypedQuery<Foo> typedQuery = getEntityManager().createQuery(query);typedQuery.setParameter(paramOne, 1L);

长期将使用参数绑定。它只是一个参数,但可以很容易地从此处推断出多个参数,并且辅助方法可以清除所有内容。

参考文献:

大多数推理在HHH-6280中进行了解释和讨论。进行此渲染的特定方法是Literalexpression.render。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447621.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号