gpt4 book ai didi

java - 从列表或两个不同实体动态查询

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:02 25 4
gpt4 key购买 nike

我有一个名为 Person 的实体,位于基本元数据内,然后位于标签和语言内。我想获取包含特定标签名称和语言的所有行。我开始了解 Criteria Query。我们如何将两个不同的实体链接在一起?

示例:获取标签为 Model、语言为 English 的所有行。

@Entity
public Person {
@Id
private String id;
private BasicMetadata basicMetadata;
-----------
}

基本元数据表

@Entity
public BasicMetadata {
@Id
private String id;
private List<Tag> tags;
private List<Language> language;
-------------
}

标签表

@Entity
public Tag {
@Id
private String id;
private String name;
-------------

}

语言表

@Entity
public Language{
@Id
private String id;
private String name;
-------------

}

我创建了一个简单的规范查询方法,是正确的

 private Specification<Person> containsText(String keyword) {
return (root,query, builder) -> {
String finalText = keyword.toLowerCase();
if (!finalText.contains("%")) {
finalText = "%" + finalText + "%";
}
Predicate genreExp = builder.like(builder.lower(root.get("basicMetadata").get("tags")), finalText);
return builder.or(genreExp);
};

最佳答案

你可以这样写你的规范

public class PersonSpecifications {

public static Specification<Person> hasTag(String keyword) {
return (root, query, builder) -> {
String finalText = keyword.toLowerCase();
if (!finalText.contains("%")) {
finalText = "%" + finalText + "%";
}
Join<Person, BasicMetaData> md = root.join("basicMetaData");
return builder.like(builder.lower(md.join("tags").get("name")), finalText);
}
}
}

您可以使用此规范来获取像这样的过滤结果

 repository.findAll(PersonSpecifications. hasTag("abc"),PageRequest,of(0,10));

关于java - 从列表或两个不同实体动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54007603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com