弹簧数据JPA optional.orelse无法正常工作

时间:2019-05-14 15:38:14

标签: spring-data-jpa

Country country = countryService.findCountryByName(DEFAULT_COUNTRY_NAME)
                    .orElse(countryService.create(createCountryEntity()));

服务:

public Optional<Country> findCountryByName(String name) {
        return dao.findByNameIgnoreCase(name);
    }

@Transactional(propagation = Propagation.REQUIRED)
public Country create(Country country) {
    return dao.save(country);
}

道:

@Transactional
public interface CountryDao extends JpaRepository<Country, Integer> {
    Optional<Country> findByNameIgnoreCase(String name);
}

实体

@Entity
@Table(name = "country")
@Data
public class Country {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "country_id", updatable = false)
    @JsonIgnore
    private int id;

    @Column(name = "country_name")
    @NotNull
    @Size(min = 4, max = 100)
    private String name;
}

我不知道为什么countryService.findCountryByName(DEFAULT_COUNTRY_NAME) .orElse(countryService.create(createCountryEntity()));总是进入orElse块,即使我已验证调试器中是否存在第一部分。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

  

我不知道为什么即使我已经验证了第一部分的存在也总是进入orElse块

这就是Java的工作方式。 orElse只是一种方法,而不是if条件或其他条件。 因此,其参数将在调用之前得到评估。

您可能想要类似的东西

Country country = countryService
        .findCountryByName(DEFAULT_COUNTRY_NAME)
        .orElseGet(() -> countryService.create(createCountryEntity()));