让我们描述以下用例:我有一个JPQL查询,它使用new
关键字即时创建数据对象。在SELECT
子句中,我想注入一个数据库不知道但属于查询它的层的属性。
这看起来像
EntityManager em; // Got it from somewhere
boolean editable = false; // Value might change, e.g. depending on current date
Query q = em.createQuery("SELECT new foo.bar.MyDTO(o, :editable) FROM MyObject o")
.setParameter("editable", editable);
List<MyDTO> results = (List<MyDTO>) q.getResultList();
任何想法如何将这种属性或参数注入SELECT子句在JPQL中如何工作? JPA和JPA 2.0解决方案均适用。
编辑:效果不起关键作用,但代码的清晰度和清晰度。
答案 0 :(得分:4)
在简单地遍历结果列表并在每个元素上调用setter时,您是否测量过性能问题?我猜这与
相比你的循环会非常快。
如果您对性能如此关注,则应该从返回的MyObject实例手动构建MyDTO实例,而不是依赖于Hibernate和反射来实现它。
保持简单,安全,可读和可维护。然后,如果您遇到性能问题,请测量以检测其来源。然后,只有这样,优化。
答案 1 :(得分:2)
如果没有可能的供应商扩展,它将无法工作,因为根据规范:
4.6.4输入参数
...
输入参数只能用于 查询的WHERE子句或HAVING子句。