2011-09-21 54 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