2016-11-14 24 views
1

我不是那么喜欢Hibernate和Spring Data JPA,我有以下疑问。如何设置Spring Data JPA查询方法必须是一个始终设置为true的参数值?

我有正确地执行查询此方法签名:

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

    AccomodationMedia findByIdAccomodationAndIsMaster(Long accomodationId, boolean isMaster); 

} 

它发现(由AccomodationMedia实体类映射表),其具有命名为idAccomodation设置好的与场的单个记录值代表accomodationId方法参数和字段isMaster重新由isMaster布尔值。

它工作正常,但我的“问题”是这样做我总是明确地通过布尔isMaster参数的值。

这个参数总是被设置为true,所以我想以这种方式来改变以往的方法签名:

AccomodationMedia findByIdAccomodationAndIsMaster(Long accomodationId, true); 

但的IntelliJ显示错误:标识符或类型预期

为什么?我可以设置该参数的值必须明确设置为true布尔值吗?

+1

因为它不是Java的语法。 – radoh

回答

5

正如reference documentation描述,你可以只使用IsTrue关键字:

AccomodationMedia findByIdAccomodationAndIsMasterIsTrue(Long accomodationId); 
+0

我认为这是一个更简洁的解决方案,tnx :-) – AndreaNobili

+0

好啊,我有点错过了,这是一个jpa问题 – radoh

+0

这应该适用于所有Spring数据存储库,而不仅限于JPA。 –

1

如果您使用的是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); 
    } 
} 

但你不能提供一个默认值的方法参数。例如。见this question

0

您无法将默认值设置为方法签名定义,您需要必须告诉Spring,它明确是您的参数值。在这种情况下,如果要避免在存储库实现中将“isMaster”设置为true,则可以使用不同的方法。您可以使用@Query注释来定义您自己的HQL查询并在查询字符串中提供默认值,只要您想使用命名查询创建自己的自定义存储库方法,而不是使用Spring提供的命名方法定义,就可以使用此方法数据架构。

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

@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”属性。

相关问题