Код: Выделить всё
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())));
}
}
Код: Выделить всё
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();
}
}
Код: Выделить всё
@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;
// ...
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... phql-query
Мобильная версия