【问题标题】:fetch properties in preferred language if doesn't exist fetch in default language如果不存在则以首选语言获取属性以默认语言获取
【发布时间】:2023-02-01 02:35:28
【问题描述】:

我有食物表,其中包含多种食物,每种食物都可以具有多种语言(en,es)的特定属性,例如名称,描述等。但是不确定该用户的首选语言是否始终存在所有属性,所以如果它们不存在于首选语言中,我们可以从默认语言中选择属性,这样我们就可以确保我们始终有数据显示在我们的应用程序上,

这是我的 PostgreSQL 表结构

**Food Table**
*food_id    visibility*
1             true

**Properties Table**
*property_id    property_code*
1              name
2           description
3           short desc

**Food Properties Table**
*food_property_id     food_id   property_id       value            language_id*
        1                1               1           food name in en           en
        2                1               1           food name in es           es
        3                1               2           food description in en        en
        4                1               2           food description in es        es
        5                1               3           food short desc in en         en
        6                1               3           food short desc in es         es

情况1 首选语言 - es ||默认语言 - en 所有 es 属性都存在 - 全部获取

Result
**Food Properties Table**
*food_property_id     food_id   property_id       value            language_id*
        2                1               1           food name in es           es
        4                1               2           food description in es        es
        6                1               3           food short desc in es         es

案例二 首选语言 - es ||默认语言 - en es 缺少 Property Id 2(description) 和 3(short desc),从默认语言 (en) 获取

**Food Properties Table**
*food_property_id     food_id   property_id       value            language_id*
        2                1               1           food name in es           es
        3                1               2           food description in en        en
        5                1               3           food short desc in en         en

我希望你现在清楚这个想法,我们要确保如果特定属性不存在,请以默认语言查找该属性,我必须在应用程序中向使用不同语言的多个用户显示此食物列表,但不能保证该食物的所有属性都存在所以我们可以显示默认语言的属性,只是为了确保应用程序上的所有数据始终看起来是填充的而不是空的。

我使用 PostgreSQL 作为数据库,使用 Java 进行编程,我对两种语言的解决方案持开放态度,首选 Java,我尝试了很多但使用了太多循环来比较每个项目,所以寻找优化的。任何帮助将不胜感激。

`公共课食品测试{

class FoodProperties {
    private String propertyCode;
    private String value;
    private String languageId;
    // getters, setters, constructors
}

public static void main(String[] args) {
    List<FoodProperties> foodProperties = new ArrayList<>();
    FoodProperties p1 = new FoodProperties("1", "food name in en", "en");
    FoodProperties p2 = new FoodProperties("1", "food name in es", "es");
    FoodProperties p3 = new FoodProperties("2", "description in en", "en");
    FoodProperties p4 = new FoodProperties("2", "description in es", "es");
    FoodProperties p5 = new FoodProperties("3", "short desc in en", "en");

    foodProperties.add(p1);
    foodProperties.add(p2);
    foodProperties.add(p3);
    foodProperties.add(p4);
    foodProperties.add(p5);

    String preferredLanguage = "es";
    String defaultLanguage = "en";

    List<FoodProperties> result = new ArrayList<>();
    for (FoodProperties foodProperty : foodProperties) {
        String propertyCode = foodProperty.getPropertyCode();
        Optional<FoodProperties> food = foodProperties.stream()
                .filter(f -> f.getLanguageId().equals(preferredLanguage)
                        && f.getPropertyCode().equals(propertyCode))
                .findFirst();
        if (food.isPresent()) {
            result.add(food.get());
        } else {
            Optional<FoodProperties> foodDef = foodProperties.stream()
                    .filter(f -> f.getLanguageId().equals(defaultLanguage)
                            && f.getPropertyCode().equals(propertyCode))
                    .findFirst();
            if (foodDef.isPresent()) {
                result.add(foodDef.get());
            }
        }
    }
    for (FoodProperties foodProperties2 : result) {
        System.out.println(foodProperties2);
    }
}

}`

【问题讨论】:

    标签: java postgresql java-stream


    【解决方案1】:

    当只选择几行时,您可以将表连接到自身并以第一种可用语言保留数据

    SELECT 
         coalesce(l1.food_property_id,l2.food_property_id) food_property_id,
         coalesce(l1.food_id, l2.food_id) food_id,    
         coalesce(l1.property_id, l2.property_id) property_id,         
         coalesce(l1.value, l2.value) value,              
         coalesce(l1.language_id, l2.language_id) language_id
    FROM food_properties l1
     LEFT JOIN food_properties l2 
      ON l1.food_id = l2.food_id 
      AND l1.property_id = l2.property_id
      AND l2.language_id = 999 --default_language_id
    WHERE l1.language_id = 1   --ideal_language_id
    

    请注意,如果您有两张表,一张用于通用属性,一张用于本地化属性,则此方法会更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多