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

Spring Data JPA投影从DB中选择的字段

陈朗
2023-03-14

我正在测试Spring Data 1.10.4.Release,遵循Spring Data Docs http://Docs.Spring.io/spring-data/jpa/Docs/current/reference/html/#Projections中的示例

@Entity
public class Person {

  @Id @GeneratedValue
  private Long id;
  private String firstName, lastName;

  @OneToOne
  private Address address;
}

@Entity
public class Address {

  @Id @GeneratedValue
  private Long id;
  private String street, state, country;
}
  • 问题1:

以下预测:

interface PersonLimited {  

  String getFirstName(); 

  AddressLimited getAddress();
}

interface AddressLimited {  

  String getCountry(); 
}

当我运行findPersonByFirstNameProjectedForLimitedData时

interface PersonRepository extends CrudRepository<Person, Long> {

  @Query("select p from Person p where p.firstName = ?1")
  PersonLimited findPersonByFirstNameProjectedForLimitedData(String firstName);
}
{
    firstName: 'Homer',
    address: {
        country: 'USA'
    }
}
SELECT person0_.firstName      AS col_0_0_, 
       address1_.id            AS id1_13_, 
       address1_.street        AS street2_13_, 
       address1_.state         AS state3_13_, 
       address1_.country       AS country4_13_
FROM   person person0_ 
       LEFT OUTER JOIN address address1_ 
                    ON person0_.addressId = address1_.id 
WHERE  person0_.firstName = ?  
SELECT person0_.firstName      AS col_0_0_, 
       address1_.country       AS country4_13_
FROM   person person0_ 
       LEFT OUTER JOIN address address1_ 
                    ON person0_.addressId = address1_.id 
WHERE  person0_.firstName = ?  
  • 问题2:

对于与上述相同的预测,

当我运行findAllPersonsProjectedForLimitedData时

interface PersonRepository extends CrudRepository<Person, Long> {

  @Query("select p from Person p")
  List<PersonLimited> findAllPersonsProjectedForLimitedData();
}
[
     {
        firstName: 'Homer',
        address: {
            country: 'USA'
        }
     },
     {
        firstName: 'Maggie',
        address: {
            country: 'USA'
        }
     }
]
SELECT person0_.id                 AS id1_18_, 
       person0_.firstName          AS firstName2_18_, 
       person0_.lastName           AS lastName3_18_, 
       person0_.addressid          AS company4_18_
FROM   person person0_ 

SELECT address0_.id         AS id1_13_0_, 
       address0_.street     AS street2_13_0_, 
       address0_.state      AS state3_13_0_, 
       address0_.country    AS country4_13_0_
FROM   address address0_ 
WHERE  address0_.id = ? 
SELECT person0_.firstName        AS firstName2_18_
FROM   person person0_ 

SELECT address0_.country    AS country4_13_0_
FROM   address address0_ 
WHERE  address0_.id = ? 

共有1个答案

郎永福
2023-03-14

如果您希望在Spring数据投影中使用注释@Query,那么您必须使用字段别名,并且您需要确保对与投影字段匹配的项目进行别名。下面的代码应该适用于问题1:

interface PersonRepository extends CrudRepository<Person, Long> {

  @Query("select p.firstName as firstname, p.address as address from Person p where p.firstName = ?1")
  PersonLimited findPersonByFirstNameProjectedForLimitedData(String firstName);
}

您可以使用的另一种选择是使用属性表达式定义查询。只要可能:

interface PersonRepository extends CrudRepository<Person, Long> {

  List<PersonLimited> findByFirstName(String firstName);
}
 类似资料:
  • 我正在尝试从一个select表单中获取一个时间值。我在代码中看不到任何错误,尝试更改所有类名和变量,但值仍然没有被get select。(提交表单后我看不到所选的值) 代码添加如下:

  • 我正在使用Hibernate标准和投影来获得不同的值,如下所示: 我正在使用带有投影的结果转换器来获取不同值的列表

  • 这只有两种方式: 具有qdoc.id:存在,为空 不带qdoc.id:为空,存在 我已经检查过的内容:当我在Postgres客户机中运行Hibernate查询时,它总是带来字段。Bot在这两种情况下都存在。

  • 问题内容: 对此不熟悉,尝试按照著名的Flask教程使用Flask-bootstrap,Flask-wtforms,Jinja等构建一个应用程序 我有一个带有2个选择字段和一个按钮的表单。 我只希望第一个字段预先填充,而另一个字段根据前一个字段的选定值填充(在客户端?)。 在模板中,我尝试类似 可以正常工作(只要我返回元组列表以使用正确的javascript和路由填充下一个字段),但我想要以下内容

  • 问题内容: 使用Python,如何将字段提取为变量?基本上,我将其转换为: 像 问题答案: 假设您将该字典存储在一个名为值的变量中。要进入变量,请执行以下操作: 如果该json位于文件中,请执行以下操作以加载它: 如果该json来自URL,请执行以下操作以加载它: 要打印所有条件,您可以:

  • 我试图使用一个投影来从一个实体中提取数据,它有一些关系。然而。投影上的构造函数接受三个参数;一个集合,整数和另一个整数。如果没有这个集合作为参数,这一切都很好,但是一旦我添加了这个集合,我就开始得到SQL语法查询错误。 这里有一个我正在使用的例子... 下面是我正在使用的查询(不完全相同,因为这是我正在处理的问题的简化版本).... 所以,我想我的主要问题是,我如何将一个集合作为一个对象包含在投影