【发布时间】: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