本机查询中的Spring JPA存储库子查询
我正在尝试对存储库方法运行本机查询,以便它返回带有一些计数的结果。使用JPQL太复杂了,所以我选择了本机查询 存储库 该实体有两个带有@Transient注释的属性,因此该信息不会持久化到数据库中。除了2个瞬态属性返回空值外,所有数据都恢复正常。当我从控制台复制查询并将其粘贴到MySQL Workbench中时,结果与预期一致,并且我看到了所需的计数。无论如何,我不确定是否还需要做些什么才能使本机查询作为注释工作。我在子查询SELECT 55 FROM中硬编码了一个值。。。只是想看看计数是否有问题,结果还是返回空值。我在Workbench中运行了这个查询,结果很好 我已尝试将瞬态属性类型从Integer、Long、BigInteger、Long、int。。。所有这些都没有改变。因为我在使用Groovy,所以我还尝试使用def让Groovy推断类型,但这也不起作用本机查询中的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中硬编码了一个值。。。只是想看看计数是否有问
我也试着从终端运行这个项目,但仍然没有成功。我已经在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
}