代码之家  ›  专栏  ›  技术社区  ›  Edy Bourne

JPA查询只选择特定列而不使用条件查询?

  •  62
  • Edy Bourne  · 技术社区  · 10 年前

    可以只选择财产吗 使用 JPA 查询 而不使用条件查询?

    要选择所有财产,我只需执行以下操作:

    SELECT i FROM ObjectName i WHERE i.id = 10
    

    但我有一个对象 许多的 遗留系统上的财产,并且希望只选择几个,尽管我知道选择几个财产通常很快。

    是否可以不使用条件查询?

    6 回复  |  直到 3 年前
        1
  •  103
  •   Patrick Leitermann    6 年前

    是的,就像在普通sql中一样,您可以指定要选择的财产类型:

    SELECT i.firstProperty, i.secondProperty FROM ObjectName i WHERE i.id=10
    

    执行此查询将返回Object[]列表,其中每个数组包含一个对象的选定财产。

    另一种方法是将选定的财产包装在自定义对象中,并在TypedQuery中执行:

    String query = "SELECT NEW CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=10";
    TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
    List<CustomObject> results = typedQuery.getResultList();
    

    示例可在 this 文章

    更新日期:2018年3月29日:

    @磷虾:

    @PatrickLeitermann为我提供了“由:org.hibernate.hql.internal.ast.QuerySyntaxException:无法定位类***”异常。如何解决这个问题?

    我猜你在Spring应用程序的上下文中使用JPA,是吗?其他一些人 the same problem 他们的解决方案是在 选择新的 关键词。

    也许Spring数据框架的内部实现只识别用 @实体 或通过其简单名称在特定的orm文件中注册,这导致使用此解决方法。

        2
  •  25
  •   Abdullah Mohammad Motiullah Saurabh Jhunjhunwala    7 年前

    您可以使用以下内容:

    List<Object[]> list = em.createQuery("SELECT p.field1, p.field2 FROM Entity p").getResultList();
    

    然后您可以对其进行迭代:

    for (Object[] obj : list){
        System.out.println(obj[0]);
        System.out.println(obj[1]);
    }
    

    但是 如果查询中只有一个字段,则会得到一个不是来自Object[]的类型列表

        3
  •  15
  •   Abdullah Mohammad Motiullah Saurabh Jhunjhunwala    7 年前

    Projections 可以用于仅选择实体对象的特定财产(列)。

    从文档中

    当使用查询方法时,Spring数据存储库通常返回域模型。然而,有时,出于各种原因,您可能需要更改该模型的视图。在里面 this 在第节中,您将学习如何定义投影以提供简化和简化的资源视图。

    定义仅具有 getters 你想要的。

    interface CustomObject {  
        String getA(); // Actual property name is A
        String getB(); // Actual property name is B 
    }
    

    现在返回 CustomObject 从存储库中,如下所示:

    public interface YOU_REPOSITORY_NAME extends JpaRepository<YOUR_ENTITY, Long> {
        CustomObject findByObjectName(String name);
    }
    
        4
  •  8
  •   sagneta    9 年前

    回答很好!我确实有一点补充。关于此解决方案:

    TypedQuery<CustomObject> typedQuery = em.createQuery(query , String query = "SELECT NEW CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=100";
    TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
    List<CustomObject> results = typedQuery.getResultList();CustomObject.class);
    

    要防止类未找到错误,只需插入完整的包名。假设org.company.directory是CustomObject的包名:

    String query = "SELECT NEW org.company.directory.CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=10";
    TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
    List<CustomObject> results = typedQuery.getResultList();
    
        5
  •  0
  •   SerhatCan    10 年前

    我想如果我正确理解了你的问题,你可以看看这个链接 http://www.javacodegeeks.com/2012/07/ultimate-jpa-queries-and-tips-list-part_09.html

    例如,他们创建了如下查询:

     select id, name, age, a.id as ADDRESS_ID, houseNumber, streetName ' +
     20' from person p join address a on a.id = p.address_id where p.id = 1'
    
        6
  •  0
  •   ez121sl    10 年前

    是的,这是可能的。您所要做的就是将查询更改为 SELECT i.foo, i.bar FROM ObjectName i WHERE i.id = 10 。查询结果将是 List 的数组 Object 。每个数组中的第一个元素是 i.foo 第二个元素是值 i.bar 。请参阅 JPQL reference .