gpt4 book ai didi

java - 使用 ResultTransformer (DTO) 进行 Hibernate 搜索

转载 作者:行者123 更新时间:2023-12-01 16:32:05 24 4
gpt4 key购买 nike

我需要从Hibernate搜索结果中收集特定的DTO,我连接了maven中的所有依赖项,根据官方文档编写了以下请求(我删除了不必要的代码,这只会造成困惑,只留下搜索所需):

public List<QuestionDto> search(String text) {

FullTextQuery query = fullTextEntityManager.createFullTextQuery(queryBuilder
.simpleQueryString()
.onField("description")
.matching(text)
.createQuery())
.setProjection("id", "description", "title", "countValuable", "persistDateTime", "user.fullName", "tags")
.setResultTransformer(new ResultTransformer() {

@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
return QuestionDto.builder()
.id(((Number) tuple[0]).longValue())
.title((String) tuple[2])
.description((String) tuple[1])
.countValuable(((Number) tuple[3]).intValue())
.persistDateTime((LocalDateTime) tuple[4])
.username((String) tuple[5])
.tags((List<TagDto>) tuple[6])
.build();
}

@Override
public List transformList(List collection) {
return collection;
}
});
return query.getResultList();
}

但是由于某种原因而不是标 checkout 现 NULL也许有人有什么想法?

实体问题

@Indexed
public class Question {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Field(store = Store.YES)
private String title;

private Integer viewCount = 0;

@Field(store = Store.YES)
private String description;

@Field(store = Store.YES)
private LocalDateTime persistDateTime;

@Field(store = Store.YES)
private Integer countValuable = 0;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@IndexedEmbedded(includePaths = "fullName")
private User user;

@ManyToMany(fetch = FetchType.LAZY)
@IndexedEmbedded(includeEmbeddedObjectId = true, includePaths = {"name", "description"})
private List<Tag> tags;

实体标签

public class Tag {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Field(store = Store.YES)
private String name;

@Field(store = Store.YES)
private String description;
private LocalDateTime persistDateTime;

@ManyToMany(mappedBy = "tags", fetch = FetchType.LAZY)
@ContainedIn
private List<Question> questions;

最佳答案

这里有两个问题:

  1. 不支持多值字段上的投影。
  2. 您正在尝试投影到“对象”字段:“标签”本身不包含值,它只有子字段(“tags.name”、“tags.description”)。目前不支持“对象”字段上的投影。

如果您使用 Elasticsearch 后端,则可以利用 _source 投影 (org.hibernate.search.elasticsearch.ElasticsearchProjectionConstants#SOURCE),这将返回 Elasticsearch 文档的字符串表示形式,格式为 JSON。然后您可以解析它(例如使用 Gson)以提取您需要的任何信息。

当然,您始终可以选择根本不使用投影,然后从数据库加载的实体中提取信息。

请注意,在 Hibernate Search 6(目前为测试版)中,我们将添加对 projections on multi-valued fields 的内置支持,但它不太可能被添加到 Hibernate Search 5,因为 Hibernate Search 5 处于维护模式(没有新功能或改进,只有错误修复)。

在更遥远的将来,我们可能会添加 more direct support for DTOs .

关于java - 使用 ResultTransformer (DTO) 进行 Hibernate 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62020302/

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