content: package com.ctrip.framework.apollo.biz.repository;
  
  import com.ctrip.framework.apollo.biz.entity.InstanceConfig;
  
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.Pageable;
  import org.springframework.data.jpa.repository.Modifying;
  import org.springframework.data.jpa.repository.Query;
  import org.springframework.data.repository.PagingAndSortingRepository;
  import org.springframework.data.repository.query.Param;
  
  import java.util.Date;
  import java.util.List;
  import java.util.Set;
  
  public interface InstanceConfigRepository extends PagingAndSortingRepository<InstanceConfig, Long> {
  
    InstanceConfig findByInstanceIdAndConfigAppIdAndConfigNamespaceName(long instanceId, String
        configAppId, String configNamespaceName);
  
    Page<InstanceConfig> findByReleaseKeyAndDataChangeLastModifiedTimeAfter(String releaseKey, Date
        validDate, Pageable pageable);
  
    Page<InstanceConfig> findByConfigAppIdAndConfigClusterNameAndConfigNamespaceNameAndDataChangeLastModifiedTimeAfter(
        String appId, String clusterName, String namespaceName, Date validDate, Pageable pageable);
  
    List<InstanceConfig> findByConfigAppIdAndConfigClusterNameAndConfigNamespaceNameAndDataChangeLastModifiedTimeAfterAndReleaseKeyNotIn(
        String appId, String clusterName, String namespaceName, Date validDate, Set<String> releaseKey);
  
    @Modifying
    @Query("delete from InstanceConfig  where ConfigAppId=?1 and ConfigClusterName=?2 and ConfigNamespaceName = ?3")
    int batchDelete(String appId, String clusterName, String namespaceName);
  
    @Query(
        value = "select b.Id from `InstanceConfig` a inner join `Instance` b on b.Id =" +
            " a.`InstanceId` where a.`ConfigAppId` = :configAppId and a.`ConfigClusterName` = " +
            ":clusterName and a.`ConfigNamespaceName` = :namespaceName and a.`DataChange_LastTime` " +
            "> :validDate and b.`AppId` = :instanceAppId and ?#{#pageable.pageSize} > 0",
        countQuery = "select count(1) from `InstanceConfig` a inner join `Instance` b on b.id =" +
            " a.`InstanceId` where a.`ConfigAppId` = :configAppId and a.`ConfigClusterName` = " +
            ":clusterName and a.`ConfigNamespaceName` = :namespaceName and a.`DataChange_LastTime` " +
            "> :validDate and b.`AppId` = :instanceAppId",
        nativeQuery = true)
    Page<Object[]> findInstanceIdsByNamespaceAndInstanceAppId(
        @Param("instanceAppId") String instanceAppId, @Param("configAppId") String configAppId,
        @Param("clusterName") String clusterName, @Param("namespaceName") String namespaceName,
        @Param("validDate") Date validDate, Pageable pageable);
  }
  