如何设置Spring Data JPA查询方法必须始终将一个参数值设置为true?

6

我很少接触Hibernate和Spring Data JPA,我有以下疑问。

我有一个方法签名,可以正确执行查询:

@Repository
public interface AccomodationMediaDAO extends JpaRepository<AccomodationMedia, Long> {

    AccomodationMedia findByIdAccomodationAndIsMaster(Long accomodationId, boolean isMaster);

}

它在由“AccomodationMedia”实体类映射的表中查找一个名为“idAccomodation”的字段设置为方法参数“accomodationId”表示的“Long”值和名为“isMaster”的字段表示为布尔值“isMaster”的单个记录。
它工作正常,但我的“问题”是,这样做时我总是必须明确传递布尔值“isMaster”参数。
该参数必须始终设置为“true”,因此我尝试以以下方式更改先前的方法签名:
AccomodationMedia findByIdAccomodationAndIsMaster(Long accomodationId, true);

但是IntelliJ显示错误:需要标识符或类型

为什么?我能设置这个参数的值必须明确设置为true布尔值吗?


1
因为那不是Java语法。 - radoh
3个回答

11

如在参考文档中所述,您只需使用IsTrue关键字即可:

AccomodationMedia findByIdAccomodationAndIsMasterIsTrue(Long accomodationId);

我认为这是更整洁的解决方案,谢谢 :-) - AndreaNobili
哦,好吧,我有点忘记这是一个JPA问题了。 - radoh
这应该适用于所有Spring Data仓库,而不仅仅是JPA。 - Oliver Drotbohm

5

如果您正在使用Java 8,可以使用“default”实现来进行重载:

public interface AccomodationMediaDAO extends JpaRepository<AccomodationMedia, Long> {

    AccomodationMedia findByIdAccomodationAndIsMaster(Long accomodationId, boolean isMaster);

    default AccomodationMedia findByIdAccomodationAndIsMaster(Long accomodationId) {
       return findByIdAccomodationAndIsMaster(accomodationId, true);
    }
}

但是你不能为方法参数提供默认值。例如,参见这个问题


0

在方法签名定义中,你无法设置默认值,你必须明确告诉Spring哪个是你的参数值。如果你想避免在存储库实现中将"isMaster"设置为true,你可以采用不同的方法。你可以使用@Query注释来定义自己的HQL查询,并在查询字符串中提供默认值。这种方法可以用于创建自己的自定义存储库方法,而不是使用Spring Data架构提供的命名方法定义。

在你的特定情况下,你可以尝试像这样做:

@Repository
public interface AccomodationMediaDAO extends JpaRepository<AccomodationMedia, Long> {

    @Query("SELECT a FROM AccomodationMedia a WHERE a.accomodationId = :accomodationId AND a.isMaster = true")
    AccomodationMedia findByIdAccomodationAndIsMaster(@Param(value = "accomodationId") Long accomodationId);

}

请注意,点符号(a.accomodationId)后映射的属性名称必须与声明在实体POJO中的实体本地列名称匹配,这意味着“accomodationId”必须与表示ID列的变量名称相匹配,同样适用于“isMaster”属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接