【问题标题】:How to check if an entity exists in DB using methods from SimpleJpaRepository如何使用 SimpleJpaRepository 中的方法检查数据库中是否存在实体
【发布时间】: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


【解决方案1】:

我会做一个这样的 JPQL 查询:

select case when (count(*) > 0)  then true else false end from MyEntity m where m.taskEntity.id = :id and upper(m.name) = upper(:name)

它会返回一个不错的布尔值。

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2021-01-14
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多