我有一个名为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”。有人知道在一个查询中是否可以这样做吗?
答案 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。第一项是你想要的。