【发布时间】:2020-07-24 10:44:48
【问题描述】:
我正在尝试使用SimpleJpaRepository 中提供的方法找出是否存在与一些条件匹配的实体。
我的实体如下所示:
@Entity
public class MyEntity{
@Id
private int id;
@ManyToOne
private TaskEntity taskEntity;
@Column
private String name;
...
我的方法是这样的:
/** Check if any entity exists with the given taskId and name */
public boolean existsByTaskAndName(int taskId, String name){
MyEntity probe = new MyEntity();
probe.setTask(entityManager.getReference(TaskEntity.class, taskId));
probe.setName(name);
return exists(Example.of(probe, ExampleMatcher.matching().withIgnoreCase()));
}
我希望 sql 查询看起来像这样:
select top 1 * from my_entity where task=@taskId and lower(name)=lower(@name)
但实际上,SQL 查询包含与 TaskEntity 和与 TaskEntity 相关的所有实体的内部连接,并且 where 子句包含来自 TaskEntity 的所有字段与来自所有其他相关实体的所有字段之间的比较。 (总共 10 多个内部连接和 100 多个 where 子句)。
如何编写方法,使其仅比较“任务”和“名称”列,不进行任何连接,也不读取不必要的对象?
【问题讨论】:
-
使用原生查询。 JPA 用于对象,任何时候您期望某个特定的 SQL 查询来自特定的 JPA 查询,您很可能会感到失望。
-
@Kayaman,我明白了。我不想要某个 SQL 查询,但肯定有一种方法可以使用 JPA 来检查是否已经存在具有 2 个特定值的任何记录。我稍微更新了问题
-
当然有办法。但随后 JPA 使用您不想要的连接和其他选择创建对象图。因为这就是它提供的“帮助”你的自动化。所以不,如果没有所有那些“不必要的”对象,你将无法轻松做到这一点,因为它们对于 JPA 来说不是必需的。它们对你来说是不必要的。
标签: java sql spring spring-data-jpa