2011-09-21 49 views
1

我有这样一个JPQL:JPQL不同与字符串函数

select distinct d 
from Department d 
left join fetch d.employees 

当我想去找我Department实体的懒财产之一,明显是行不通的任何更

select distinct d, substring(d.htmlDescription, 1,400) 
from Department d 
left join fetch d.employees 

该查询返回的部门数量与其中的员工数量一样多。

substring(d.htmlDescription)是重要的,因为该属性被定义为CLOB(下PostgreSQL类型TEXT):

@Column(columnDefinition = "TEXT") 
@Basic(fetch = FetchType.LAZY) 
String htmlBody; 

substring函数被翻译在SQL从而限制了数据的转移beetween数据库和web量服务器。

作为一种变通方法,我试图打破查询两个部分:

select d, substring(d.htmlDescription, 1,400) 
from Department d where d in (
    select distinct d1 
    from Department d1 left join fetch d1.employees 
) 

这doestn't的工作,因为JOIN FETCH不能子查询的FROM子句中使用。

回答

2

最后,我发现我的问题的解决方案:

  1. 修改我映射
  2. 切割2个呼叫的请求。

htmlBody字段现在在另一个实体中。因此,部门实体更轻。

class Department{ 
... 
@OneToOne (fetch = FetchType.LAZY, 
    cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
Content content = new Content(); 
... 
} 


class Content{ 
... 
@Column(columnDefinition = "TEXT") 
@Basic(fetch = FetchType.LAZY) 
String htmlBody; 
... 
} 

然后我就可以使用以下请求:

List<Department> deps = em.get().createQuery(
      "select distinct d " + 
        "from Department d " + 
        "order by d.id desc ", Department.class) 
      .setFirstResult(first) 
      .setMaxResults(count) 
      .getResultList(); 

    List<Object[]> tuple = em.get().createQuery(
      "select d, substring(d.content.htmlBody, 1,400)" + 
        "from Department d " + 
        "left join fetch d.employees" + 
        "where d in (:deps) order by d.id desc") 
      .setParameter("deps", deps) 
      .getResultList(); 

    ... //Filter the duplicates due to the fetching 

这样的话,我有2个SQL查询。在第二个查询女巫发生在少量数据上完成员工提取。子字符串在SQL中实现。完善!

0

由于我无法发表评论,所以我想指出一些我坚信的东西,作为疑问。

  1. 什么是与distinct d, substring(d.htmlDescription, 1,400)返回的对象?你可以用单独的查询获取该字符串,或者使用Java获取该子类?
  2. 我相信那个查询可以被重写成一个没有左连接语句。
  3. 也许你可以重写查询,所以你可以先把substring语句,然后不同的d?
+0

1.我添加了使用子字符串jpql函数而不是java的原因。 – GaetanZ

+0

2.左连接用于提取。这是我想要在该查询上加载的唯一懒惰关系。没有获取结果是N + 1选择。 – GaetanZ

+0

3.我不明白你的建议。 – GaetanZ