gpt4 book ai didi

java - JPQL 与字符串函数不同

转载 作者:行者123 更新时间:2023-11-30 04:59:14 25 4
gpt4 key购买 nike

我有一个像这样的 JPQL:

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

当我想要获取部门实体的惰性属性之一时,distinct 不再起作用

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

查询返回的部门数量与其员 worker 数相同。

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

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

子字符串函数在 SQL 中进行翻译,从而限制了数据库和 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
)

这不起作用,因为 JOIN FETCH 不得在子查询的 FROM 子句中使用。

最佳答案

最后我找到了解决问题的方法:

  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实现的。完美!

关于java - JPQL 与字符串函数不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7498087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com