我用spring boot starter创建了一个基本的graphql java应用程序,并在使用Hibernate和Jpa的MSSQL数据库上使用graphql spqr库。
我有一个名为“任务”的实体,有5个字段。我有一个简单的Jpa存储库和一个调用“findAllTasks”方法的简单Jpa服务。它工作得很好,但是如果我指定(例如)使用graphiql只查询一个字段,我可以通过SQL日志看到执行的select命令正在查询任务实体/表中的所有字段,而不是我想要的字段。这是预期的吗?我认为graphql只选择您在查询命令中指定的字段?
这是我的代码:
实体
@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
@Column
public String desc;
@Column
public LocalDateTime createdOn;
@Column
public LocalDateTime modifiedOn;
@Column
public String owner;
}
存储库
@Repository
public interface TaskRepository extends JpaRepository<Task, Long> {}
服务
@GraphQLApi
@Service
public class TaskService {
private TaskRepository taskRepo;
@Autowired
public TaskService(TaskRepository taskRepo) {
this.taskRepo = taskRepo;
}
@GraphQLQuery
public List<Task> findAllTasks() {
return taskRepo.findAll();
}
}
当我在graphiql中运行以下命令时:
query {
findAllTasks {
id
}
}
我从日志中得到以下SQL语句:
select task0_.id as Task1_1_0_. task0_.desc as Task1_2_0, task0_.createdOn as Task1_3_0, task0_.modifiedOn as Task1_4_0, task0_.owner as Task1_4_0 from Task as task0_
您必须区分GraphQL API和数据库。您定义了一个名为findAllTasks的查询方法GraphQL。因此,当您使用任意数量的字段调用此GraphQL查询时,它将调用Java方法实现。
可以看到,这个Java方法的实现调用了taskRepo。findAll()。所以,您将从数据库中的任务中获取所有数据。
然后,GraphQL将从Java方法获取的任务中过滤数据,以匹配GraphQL查询中询问的内容。
简而言之,GraphQL负责只返回您请求的字段,但您的实现负责从数据库中获取数据。
免责声明:我不是graphql spqr的专家,因此接下来的信息可能不适用于您的情况(因为它适用于graphql java)。
但是,如果您觉得您的实现不够高效(这里我们真正讨论的是效率),您可以研究数据加载器。
我有以下Hibernate表: 这是Createquery导致的错误: 'org.hibernate.queryException:查询指定了联接提取,但提取的关联的所有者不在选择列表中[fromelement{explicit,not a collection join、fetch join、fetch non-lazy properties,classalias=e,role=myprojec
我有两种型号: 模式: GraphQL的目标之一是性能。为此,GraphQL必须通过GraphQL请求(例如:GraphiQL)仅向数据库请求所请求的字段 如果我请求以下查询: 石墨烯-django库生成以下SQL: 它得到了模型的所有字段!与API Rest问题相同,不符合GraphQL指南。 如果我从模型中请求字段,我希望查询是: 外键如何解决这个问题?
我有两张有相同字段桌子。(请不要责怪设计)。 以下仅针对示例架构 表A ID 姓名 电话 键 所以,我想在一次查询中从满足条件“keys”的表A或表B中查询id、name,返回字段只有“id”和“name”,不管它是从表A或表B 中查询 从TABELA中选择a.id、a.name、b.id、b.name作为a,TABLEB作为b,其中a.keys=“1”或b.keys=“1” 它将重复的id、na
我的集合中的每个
我有一个带有搜索功能的spring MVC应用程序。 虚拟查询生成器 现在,这个虚拟查询生成器不支持通配符或任何其他类型。我正在学习Apache Lucene Query API(还添加了Lucene Core-7.7.1来进行项目)和一大堆教授如何使用不同类型的查询实现(TermQuery、PhraseQuery、BooleanQuery等)的文章,但这根本没有意义。最后,我仍然手动构建查询。
我对使用Solr是新手,我制作了一个新的核心并复制了默认的模式。xml到conf文件夹。我所做的更改非常微不足道。 如您所见,我将字段设置为存储=false。根据我的理解,现在进行查询搜索时不应该显示字段。但这没有发生。我尝试重新启动solr实例,并再次进行查询以索引文件。 根据Solr Wiki,这应该已经为我的文件重新编制了索引。但是,当我再次运行查询时,仍然可以看到Id。 返回的文档示例(这