当前位置: 首页 > 知识库问答 >
问题:

在Spring Data JPA中使用动态列选择查询

穆正祥
2023-03-14

从表A中选择columnList=>Id1,Id2,Id3,Id4,ID5。

使用结果,我需要从表B中查询。

以下是案例

就像这个案子会变大一样。我想知道如何在Spring Data JPA中实现这一点。它类似于Spring Data JPA中的动态投影。

注意:存储在TableA中的列名在TableB中使用。

理由:如果我能做到这一点,它将很容易拉出数据,这只是我需要的。

我们能使用CriteriaQuery和CriteriaBuilder吗???根据传递的列数,select查询将使用方法调用中传递的值进行构造。我可以将其作为列表传递,并从这个方法调用中获取结果。EntityManager.CreateQuery(criteriaQuery).GetResultList();

我需要一个比这更好的解决方案。

public void getTableBValues(final List<String> columnList) {

    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();        
    final CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createTupleQuery();
    final Root<TableB> root = criteriaQuery.from(TableB.class);

    // Construct the Selection List to get required columns from TableB
    final List<Selection<?>> pathList = columnList.stream().map(p -> {
        final Selection<Object> path = root.get(p);
        return path;
    }).collect(Collectors.toList());

    criteriaQuery.multiselect(pathList);
    // result will be stored in the result list. 
    final List<Tuple> resultList = entityManager.createQuery(criteriaQuery).getResultList();
    entityManager.close();

}

共有1个答案

葛季萌
2023-03-14

如果您只有有限数量的不同用途,所以它不是完全动态的,您可以使用投影。

有很多方法可以做到这一点。https://www.bytestree.com/spring/spring-data-jpa-projections-5-ways-return-custom-object/

使用Spring JPA最简单的方法可能如下所示:

@Repository
public interface ClassBRepository extends JpaRepository<ClassB, Long> {

     @Query("select b.id1 as id1, b.id2 as id2, b.id3 as id3 from ClassB b")
     List<Map<String, Object>> findForUseCase123();

     @Query("select b.id4 as id4, b.id5 as id5 from ClassB b")
     List<Map<String, Object>> findForUseCase45();

     ...     
}
 类似资料:
  • 问题内容: 我有一张表,默认有20列 这20列名为D1 D2 D3 … D20,现在带有选择查询,我想动态添加其他列。例如,对于D21 D22 … D31,我如何编写查询以动态递增添加此列值..最大限制为31,请帮助 缺省表列 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18 D19 D20 现在我想在连续性将列添加到D2

  • 问题内容: 我有一个数据库字段名称调用,我正在尝试使用如下所示的变量名称来选择它: 显然,SQL将解释为字符串,而不是数据库的字段,我如何以这种方式将其识别为字段名而不是字符串,可能没有任何select或if语句。 问题答案: 试试这个: 您必须组成一个动态查询,并使用 要在事物的“动态”方面添加更多内容,请使用存储过程。请参见此处的示例: http://www.marten-online.com

  • 我在这里找到了一个解决方案:如何使用ApacheCamel和MongoDB创建动态equals查询? 但这看起来需要做很多工作。难道Camel没有更简单的方法将值传递给MongoDB查询吗?我希望我们能传递Mongo使用的实际find({})语言。 以下是我的工作,一些日志显示了它在做什么:

  • 问题内容: 是否可以遍历这样的表: 变成这个: 目的是选择所有s并将它们用作列。作为行,我喜欢使用所有s。 所有条件: 所有类型 但是如何将它们组合成一个视图或某物。像这样? 如果您喜欢玩数据。这是生成表的脚本: 问题答案: 不幸的是,MySQL没有您基本上想做的功能。因此,您将需要在语句中使用聚合函数: 参见带有演示的SQL Fiddle 现在,如果您要动态执行此操作,这意味着您不知道要转置的列

  • 我想根据我的输入选择列(列表 我知道要选择不同的特定列,我可以使用@Query("SELECT DISTINCT name OF TABLE"),但是,我想给用户选择他们想要的列的灵活性。列表

  • 问题内容: 我正在使用c#中的linq查询遇到一个问题,我的linq查询如下 我有一个 perfmon 类,它包含诸如(id,counter1,counter2 …)之类的属性,现在有20多个计数器,我已经开发了sql查询以根据参数中传递的计数器名称选择id和计数器,例如,如果我已经传递了counter1,它将仅选择id,counter1(重命名为counter) 如果我将在这里使用开关盒,那么它