JPA - 有没有办法根据优先级进行选择

时间:2015-04-09 09:17:09

标签: java jpa

我有一个名为Configuration的对象,如下所示:

@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那么简单,因为如果它们存在,它将返回多个配置。我想要的逻辑是,如果给定服务存在具有给定密钥的配置,则返回它。否则,返回“DEFAULT”。有人知道在一个查询中是否可以这样做吗?

1 个答案:

答案 0 :(得分:0)

您可以:使用其他布尔列指示默认值,选择与服务或默认值匹配的行,将结果排序为在末尾具有默认值的行等。

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

不幸的是,您无法在查询中设置限制,因此存储库应返回List。第一项是你想要的。