Запрос динамических полей из БД с запрошенными полями в запросе GraphQLJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Запрос динамических полей из БД с запрошенными полями в запросе GraphQL

Сообщение Anonymous »

Я пытаюсь получить запрошенные GraphQL поля в БД с помощью Criteria API, но при просмотре в режиме отладки или печати класса все поля из моего класса MediaModel считаются полученными.

Код: Выделить всё

public abstract class Utils {
public static Map getRequestedFields(DataFetchingEnvironment environment) {
return environment.getSelectionSet().getFields().stream()
.collect(Collectors.toMap(
SelectedField::getName,
field -> field.getSelectionSet().getFields().stream()
.map(SelectedField::getName)
.collect(Collectors.toList())));
}
}
Этот служебный метод переносит запрошенные поля и подполя из GraphQL на карту. Пример:

Код: Выделить всё

query Media{
tvserie(name: "Stranger Things"){
id
title
genres {
name
}
}
}
Сдаю:

Код: Выделить всё

{
"media": [
"id",
"title",
"genres"
],
"genres": [
"name"
]
}
Мой репозиторий:

Код: Выделить всё

@Repository
public class MediaRepositoryCustomImpl implements MediaRepositoryCustom {
@PersistenceContext
private EntityManager entityManager;

@Override
public List findMediaByNameOrAlternativeTitleAndMediaCategory(
String name,
String alternativeTitle,
Integer category,
Map requestedFields) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery(MediaModel.class);
Root mediaRoot = query.from(MediaModel.class);
Join altTitlesJoin = mediaRoot.join("alternativeTitles", JoinType.LEFT);

query.select(mediaRoot);

requestedFields.forEach((field, subFields) -> {
if (Utils.isJoinableField(mediaRoot, field)) {
Join join = mediaRoot.join(field, JoinType.LEFT);
subFields.forEach(subField -> join.fetch(subField, JoinType.LEFT));
} else {
mediaRoot.get(field);
}
});

List predicates = new ArrayList();
if (category != null) {
predicates.add(cb.equal(mediaRoot.get("mediaCategory").get("id"), category));
}

List namePredicates = new ArrayList();
if (name != null && !name.isEmpty()) {
predicates.add(cb.like(mediaRoot.get("name"), "%" + name + "%"));
}
if (alternativeTitle != null) {
predicates.add(cb.like(altTitlesJoin.get("name"), "%" + alternativeTitle + "%"));
}

if (!namePredicates.isEmpty()) {
Predicate orPredicate = cb.or(namePredicates.toArray(new Predicate[0]));
predicates.add(orPredicate);
}

if (!predicates.isEmpty()) {
query.where(cb.and(predicates.toArray(new Predicate[0])));
}

return entityManager.createQuery(query).getResultList();
}
}
MediaModel

Код: Выделить всё

@Entity
@Table(name = "medias", indexes = {@Index(name = "idx_name_media", columnList = "name_media", unique = true)})
@Getter
@Setter
public class MediaModel implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_media")
private Integer id;

@Column(name = "name_media")
private String name;

@Column(name = "episode_count")
private Integer totalEpisodes;

@Column(name = "episode_length_in_minutes")
private Integer episodeLength;

@Column(name = "about", length = 10000)
private String about;

@Column(name = "url_cover")
private String cover;

@Column(name = "url_banner")
private String banner;

@JoinColumn(name = "id_category", nullable = false)
@ManyToOne
@NotNull
private MediaCategoryModel mediaCategory;

@OneToMany(mappedBy = "media", fetch = FetchType.LAZY, orphanRemoval = true)
@NotNull
private List externalReference;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "medias_has_companies",
joinColumns = @JoinColumn(name = "medias_id_media"),
inverseJoinColumns = @JoinColumn(name = "companies_id_company"))
private List company;

// ...
}
Например, если я запрашиваю Media, запрашиваю идентификатор, имя, информацию и печатаю, вы проверяете отладку всех полей класса как заполненных. Я уже пробовал использовать EAGER, но результат тот же.


Подробнее здесь: https://stackoverflow.com/questions/791 ... phql-query
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»