如何获得使用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服务列表:autoServiceName
和serviceCategory
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);
}
有什么建议吗?
答
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);
}
希望这会有所帮助。快乐的编码!
答
既然你有两个AutoService
和Service
实体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上可用以显示此功能。
不幸的是我现在得到空白列表。我现在使用autoServiceId而不是名称。但出于某种原因,我从数据库中获取空数据列表。 – Andrew
您是否能够解决问题。上述查询将从字面上解决它。如果有效,请将其标记为正确的答案,因为它可以帮助未来搜索相同的人。否则让我知道当前的问题。对于我来说,如果你发送英文字符的类别它应该工作。 –