Java 从Spring数据中的多个表中选择
我需要编写一个select查询,从Spring数据存储库层的多个表中获取数据。我知道我们可以使用@Query来编写自定义查询,但这只能从单个表返回值吗Java 从Spring数据中的多个表中选择,java,spring,hql,spring-data,spring-data-jpa,Java,Spring,Hql,Spring Data,Spring Data Jpa,我需要编写一个select查询,从Spring数据存储库层的多个表中获取数据。我知道我们可以使用@Query来编写自定义查询,但这只能从单个表返回值吗 SELECT s.service_id, s.name, us.rating_id FROM services s, ratings r, user_services us where us.service_id = s.service_id and us.rating_id = r.rating_id
SELECT s.service_id, s.name, us.rating_id
FROM services s,
ratings r,
user_services us
where
us.service_id = s.service_id and
us.rating_id = r.rating_id and
us.user_id= ?;
接口方法可以使用本机SQL从多个表中选择列,该方法将返回对象数组列表:
public interface MyRepository extends JpaRepository {
@Query(name = [name], nativeQuery = true)
List<Object[]> methodThatQueriesMultipleTables();
}
公共接口MyRepository扩展了JpaRepository{
@查询(name=[name],nativeQuery=true)
列出查询MultipleTables()的方法;
}
列表中的每一项都是一行数据的对象数组
您还可以创建自定义存储库实现:
@NoRepositoryBean
公共接口自定义存储库{
列出查询MultipleTables()的方法;
}
公共类MyRepositoryImpl实现CustomRepository我想我选的问题的选定答案()显示了你要找的确切情况。@Nathanhes我的问题不是关于JPQL,而是关于如何将JPQL合并到Spring数据响应中,我尝试了souser的第一种方法,但我看起来很像。重新开放。如果你能找到一种方法来改写这个问题,使它更清楚,这可能会有帮助。我仍然不明白链接的问题是如何不够的。@NathanHughes我在问题中提到了SpringData,标题也相应地加了标签。你的链接在任何地方都没有提到spring数据。苏瑟的回答帮助了我,无论如何,我会接受的。请随意编辑我的问题,如果你认为它应该进一步澄清。谢谢。既然你提到了它,链接并没有提到spring数据。您应该能够在@Query中使用JPQL,并让spring数据接口上的方法返回由select new填充的dto列表。对于第一种方法,我得到的原因是:org.springframework.beans.factory.BeanCreationException:创建名为“individualProviderServicesRepository”的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalArgumentException:不是托管类型:class java.lang.Object
第二种方法在使用了一段时间后仍然有效。谢谢。不看代码很难理解,但我很高兴您能解决您的问题。您知道我如何使用这种方法将其直接映射到实体吗?如果返回的结果集来自单个表,那么在跨表联接时是否可能出现这种情况。
@NoRepositoryBean
public interface CustomRepository<[Your object]> {
List<Object[]> methodThatQueriesMultipleTables();
}
public class MyRepositoryImpl<[Your object]> implements CustomRepository<[Your object] {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<Object[]> methodThatQueriesMultipleTables() {
//use JPA query to select columns from different tables
Query nativeQuery = entityManager.createNativeQuery("query");
return query.getResultList();
}
}