У меня есть объект с именем конфигурации, который выглядит следующим образом:JPA - Есть ли способ, чтобы выбрать на основе приоритета
@Entity
@Table(name = "CONFIGURATION")
public class Configuration {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "SERVICE")
private String service;
@Column(name = "KEY")
private String key;
@Column(name = "VALUE")
private String value;
}
Там является составным уникальное ограничение на обслуживание и ключ.
У нас есть JPA хранилища для вышеуказанной модели:
public interface ConfigurationRepository extends JpaRepository<Configuration, Long>{
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
@Query("SELECT c FROM Configuration c WHERE c.service=:service AND c.key=:key)
Configuration findConfigurationByServiceAndKey(@Param("service") String service, @Param("key") String key);
}
пользователя может определить свою собственную службу, а если нет конфигурации не найдена для данной услуги, мы всегда смотреть снова для ключа по умолчанию , Таким образом, мы всегда делаем следующее:
public Configuration getConfiguration(String service, String key) {
Configuration config = configurationRepository.findConfigurationByServiceAndKey(service, key);
if (config == null) {
config = configurationRepository.findConfigurationByServiceAndKey("DEFAULT", key);
}
return config;
}
мне было интересно, если есть способ сделать это в одном запросе? Это не так просто, как сделать SELECT c FROM Configuration c WHERE (c.service=:service OR c.service=:'DEFAULT') AND c.key=:key
, так как это приведет к возврату нескольких конфигураций, если они существуют. Логика, которую я хочу, - это конфигурация с заданным ключом для данной службы, верните ее. В противном случае верните значение «ПО УМОЛЧАНИЮ». Кто-нибудь знает, возможно ли это в одном запросе?
Почему бы просто не выполнить запрос, который возвращает оба, и вернуть наиболее конкретный из репозитория или метода службы? –
@JBNizet Это был тот подход, который я собирался взять, если не могу найти лучшего решения. –