将属性注入JPQL SELECT子句

时间:2011-08-17 07:01:00

标签: java jpa persistence jpql

让我们描述以下用例:我有一个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解决方案均适用。

编辑:效果不起关键作用,但代码的清晰度和清晰度。

2 个答案:

答案 0 :(得分:4)

在简单地遍历结果列表并在每个元素上调用setter时,您是否测量过性能问题?我猜这与

相比
  • 通过数据库执行查询所花费的时间(进程间调用,网络通信)
  • 使用反射
  • 将每一行转换为MyObject实例所花费的时间
  • 使用反射将每个MyObject实例转换为MyDTO所花费的时间

你的循环会非常快。

如果您对性能如此关注,则应该从返回的MyObject实例手动构建MyDTO实例,而不是依赖于Hibernate和反射来实现它。

保持简单,安全,可读和可维护。然后,如果您遇到性能问题,请测量以检测其来源。然后,只有这样,优化。

答案 1 :(得分:2)

如果没有可能的供应商扩展,它将无法工作,因为根据规范:

  

4.6.4输入参数
  ...
  输入参数只能用于   查询的WHERE子句或HAVING子句。