如何获得使用JpaRepository的嵌套对象列表?

如何获得使用JpaRepository的嵌套对象列表?

问题描述:

我无法使用JpaRepository获取嵌套对象的列表。我会尽力解释我想用一下下面的代码:如何获得使用JpaRepository的嵌套对象列表?

汽车维修实体:

@Entity 
public class AutoService { 
    @Id 
    private long id; 

    @Column(name = "serviceName", nullable = false) 
    private String serviceName; 
} 

服务实体:

@Entity 
public class Service { 
    @Id 
    private long serviceId; 

    @Column(name = "serviceName", nullable = false) 
    private String serviceName; 

    @Column(name = "category", nullable = false) 
    private String category; 

    @ManyToOne 
    @JoinColumn(name = "autoServiceId", nullable = false) 
    private AutoService autoService; 
} 

ServiceRepository接口:

public interface ServiceRepository extends JpaRepository<Service, Long> { 
    List<Service> findByServiceNameAndCategory(String autoServiceName, String categoryName); 
} 

商业逻辑:

@org.springframework.stereotype.Service 
public class ServiceServiceImpl implements ServiceService { 
    @Autowired 
    private ServiceRepository serviceRepository; 

    @Override 
    public List<Service> findByAutoServiceAndCategory(String autoServiceName, String serviceCategory) { 
     return serviceRepository.findByServiceNameAndCategory(autoServiceName, serviceCategory); 
    } 
} 

正如我期待,上面的代码是无法提供的Service小号匹配所提供的类别和AutoService名称所需的列表。

有人可以提供建议,我应该如何使用我的资源库获取nester服务列表:autoServiceNameserviceCategory please?

编辑

现在我使用的是自定义查询。

我现在正在使用autoServiceId而不是服务名称。

但由于某种原因,我得到的对象的清单。

这是我的JPA回购。

public interface ServiceRepository extends JpaRepository<Service, Long> { 
    @Query("SELECT s from Service s where s.autoService.id = :autoServiceId and s.category = :categoryName") 
    List<Service> findByServiceNameAndCategory(@Param("autoServiceId") Long autoServiceId, @Param("categoryName") String categoryName); 
} 

有什么建议吗?

我想我知道答案。问题在我的类别中,发送到服务器。我用俄语写了它。并在服务器端编码类别的破碎值。 enter image description here

1-使用@Embedded并相应@Embeddable注释您的实体对象上,然后你的方法将获取嵌套对象。

OR

2- @Query注释用于编写自定义查询,请参阅以下链接custom query reference

您可能需要编写一个查询您的ServiceRepository

public interface ServiceRepository extends JpaRepository<Service, Long> { 

    @Query("SELECT s from Service s where s.autoService.serviceName = :autoServiceName and s.category = :categoryName") 
    Set<Round> getRoundsBySessionQuestionId(@Param("autoServiceName") String autoServiceName, @Param("categoryName") String categoryName); 

} 

希望这会有所帮助。快乐的编码!

+0

不幸的是我现在得到空白列表。我现在使用autoServiceId而不是名称。但出于某种原因,我从数据库中获取空数据列表。 – Andrew

+0

您是否能够解决问题。上述查询将从字面上解决它。如果有效,请将其标记为正确的答案,因为它可以帮助未来搜索相同的人。否则让我知道当前的问题。对于我来说,如果你发送英文字符的类别它应该工作。 –

既然你有两个AutoServiceService实体serviceName属性,ServiceRepository.findByServiceNameAndCategory等同于以下SQL查询:

SELECT 
    * 
FROM 
    Service 
WHERE 
    serviceName = ? 
AND category = ? 

正如所看到的,此查询不打AutoService实体可言,这是为什么结果并不如预期。


正确的存储库的方法是:

public interface ServiceRepository extends JpaRepository<Service, Long> { 
    List<Service> findByCategoryAndAutoServiceServiceName(String category, String autoServiceName); 
} 

此方法将通过其serviceName查询的嵌套AutoService对象,如所预期。

A sample project在Github上可用以显示此功能。

+0

非常感谢您的回答,我现在正在使用自定义查询,并从数据库中获取空列表。你能检查我的编辑吗? – Andrew

+0

@Andrew,你不需要自定义查询,那就是我的答案。你可以简单地使用'findByCategoryAndAutoServiceId'或类似的东西。如果这不适合你,请发布我们可以测试的实际代码和一些示例数据。 – manish