Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
本机查询中的Spring JPA存储库子查询_Spring_Jpa_Spring Boot_Spring Data Jpa_Spring Data Rest - Fatal编程技术网

本机查询中的Spring JPA存储库子查询

本机查询中的Spring JPA存储库子查询,spring,jpa,spring-boot,spring-data-jpa,spring-data-rest,Spring,Jpa,Spring Boot,Spring Data Jpa,Spring Data Rest,我正在尝试对存储库方法运行本机查询,以便它返回带有一些计数的结果。使用JPQL太复杂了,所以我选择了本机查询 存储库 该实体有两个带有@Transient注释的属性,因此该信息不会持久化到数据库中。除了2个瞬态属性返回空值外,所有数据都恢复正常。当我从控制台复制查询并将其粘贴到MySQL Workbench中时,结果与预期一致,并且我看到了所需的计数。无论如何,我不确定是否还需要做些什么才能使本机查询作为注释工作。我在子查询SELECT 55 FROM中硬编码了一个值。。。只是想看看计数是否有问

我正在尝试对存储库方法运行本机查询,以便它返回带有一些计数的结果。使用JPQL太复杂了,所以我选择了本机查询

存储库

该实体有两个带有@Transient注释的属性,因此该信息不会持久化到数据库中。除了2个瞬态属性返回空值外,所有数据都恢复正常。当我从控制台复制查询并将其粘贴到MySQL Workbench中时,结果与预期一致,并且我看到了所需的计数。无论如何,我不确定是否还需要做些什么才能使本机查询作为注释工作。我在子查询SELECT 55 FROM中硬编码了一个值。。。只是想看看计数是否有问题,结果还是返回空值。我在Workbench中运行了这个查询,结果很好

我已尝试将瞬态属性类型从Integer、Long、BigInteger、Long、int。。。所有这些都没有改变。因为我在使用Groovy,所以我还尝试使用def让Groovy推断类型,但这也不起作用


我也试着从终端运行这个项目,但仍然没有成功。我已经在Mac和Linux上试用过,但没能显示计数结果。

这行不通。您可以使用SQLConstructorExpression,但是返回的实例将是非托管的,这是一个主要缺点

更好的选择是创建一个简单的DB视图,其中保存项目的摘要信息。您可以使用JPA的@SecondaryTable功能将项目实体映射到它的表和关联的摘要视图

另一个好处是,您可以像对任何其他属性一样对摘要值进行排序和查询

更新的映射:

@Entity
@Table(name = "projects")
@SecondaryTable(name = "projects_summary_vw")
public class Project{

   //use Integer rather than int to avoid issue outlined here:
   //http://stackoverflow.com/a/37160701/1356423

    @Column(name  = "parts", table = "projects_summary_vw", 
          insertable="false", updateable="false")
    private Integer partsCount;

    @Column(name  = "requests", table = "requestsCount" 
          insertable="false", updateable="false")
    private Integer requestsCount;

    //other mappings as required
}
不需要自定义查询:

@RepositoryRestResource(collectionResourceRel="projects", 
        path="projects")
interface ProjectRepository extends BaseRepository<Project, Long>, 
        ProjectRepositoryCustom {

}

谢谢你的反馈,我必须考虑一下这些选项。我几乎想让JPA创建专栏,即使我不使用它们。该视图将很好地工作,并给您带来许多其他好处。您是说使用MySQL视图,而只是使用@SecondaryTable将其他列映射到它吗?是的。这就是方法。谢谢艾伦,我采用了@Formula方法,完全按照我想要的方式工作。我完全忘记了它,直到它达到1000,并注意到它的分数,我想我会标记你的答案为正确的答案,因为它是!
@RepositoryRestResource(collectionResourceRel="projects", 
        path="projects")
interface ProjectRepository extends BaseRepository<Project, Long>, 
        ProjectRepositoryCustom {

}
@Entity
@Table(name = "projects")
public class Project{

    @Formula("my count query as native sql")
    private Integer partsCount;

    @Formula("my count query as native sql")
    private Integer requestsCount;

    //other mappings as required
}