2015-04-09 2 views
0

У меня есть объект с именем конфигурации, который выглядит следующим образом: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, так как это приведет к возврату нескольких конфигураций, если они существуют. Логика, которую я хочу, - это конфигурация с заданным ключом для данной службы, верните ее. В противном случае верните значение «ПО УМОЛЧАНИЮ». Кто-нибудь знает, возможно ли это в одном запросе?

+0

Почему бы просто не выполнить запрос, который возвращает оба, и вернуть наиболее конкретный из репозитория или метода службы? –

+0

@JBNizet Это был тот подход, который я собирался взять, если не могу найти лучшего решения. –

ответ

0

Вы можете: указать значение по умолчанию, используя дополнительный булевский столбец, выбрать строки, соответствующие либо служебному, либо по умолчанию, для результата заказа, чтобы строка имела значение по умолчанию в конце.

SELECT c FROM Configuration c WHERE (c.service=:service OR c.isDefault = true) AND c.key=:key ORDER BY c.isDefault DESC 

К сожалению, вы не можете установить лимит в запросе, поэтому репозиторий должен вернуть список. Первый элемент - тот, который вы хотите.

Смежные вопросы