[英]Use result of of query of one table/entity to query another entity/table
我有两个表,由两个实体表示:
@Entity
public class HostEntity
{
@NotNull
private String myGroup;
@Id
@NotNull
private String host;
@NotNull
private long inGroupSince;
}
和
@Entity
public class GroupEntity
{
@NotNull
private String groupId;
@Id
@NotNull
private String propertiesStr;
}
我为每个实体/表都有crudRepository 。
因此,给定两个数字startTime和finishTime ,以及两个字符串stringA和stringB首先-获取所有HostEntity.myGroup(以下称此ListA ),使HostEntity.inGroupSince在startTime和finishTine之间,然后返回所有GroupEntity.groupId该GroupEntity.groupdId在ListA和GroupEntity.propertiesStr中包含stringA和StringB
实现这一目标的最佳方法是什么? 我可以在一个查询中做到吗?
我使用crudRepository在Spring Boot中工作,这是一个新手。
我可以在repostiroy中使用@query批注,例如,我得到了以下代码:
@Repository
@Profile(Constants.SPRING_PROFILE_DEVELOPMENT)
public interface IGroupsRepositoryDev extends IGroupsRepository
{
@Query("SELECT j FROM GroupEntity j WHERE LOWER(j.propertiesStr) LIKE %?1% and LOWER(j.propertiesStr) LIKE %?2% and LOWER(j.propertiesStr) LIKE %?3%"
+ " and LOWER(j.propertiesStr) LIKE %?4% and LOWER(j.propertiesStr) LIKE %?5% and LOWER(j.propertiesStr) LIKE %?6% and LOWER(j.propertiesStr) LIKE %?7%"
+ " and LOWER(j.propertiesStr) LIKE %?8% and LOWER(j.propertiesStr) LIKE %?9% and LOWER(j.propertiesStr) LIKE %?10% and LOWER(j.propertiesStr) LIKE %?11% ")
List<UUID> findByProperties(String property1,String property2,String property3,String property4,String property5,String property6
,String property7,String property8,String property9,String property10,String property11);
}
返回每个GroupEntity,以便GroupEntity.propertiesStr在其中包含11个字符串
UPDATE
我按照以下建议使用以下内容:
@Query(" SELECT groupId from GroupEntity where groupId IN (SELECT myGroup FROM HostEntity WHERE inGroupSince > ?12 AND inGroupSince < ?13) "
+ "AND LOWER(propertiesStr) LIKE %?1% and LOWER(propertiesStr) LIKE %?2% and LOWER(propertiesStr) LIKE %?3%"
+ " and LOWER(propertiesStr) LIKE %?4% and LOWER(propertiesStr) LIKE %?5% and LOWER(propertiesStr) LIKE %?6% and LOWER(propertiesStr) LIKE %?7%"
+ " and LOWER(propertiesStr) LIKE %?8% and LOWER(propertiesStr) LIKE %?9% and LOWER(propertiesStr) LIKE %?10% and LOWER(propertiesStr) LIKE %?11% ")
List<String> findByPropertiesBetweenTime(String property1,String property2,String property3,String property4,String property5,String property6
,String property7,String property8,String property9,String property10,String property11,long st,long ft);
我把它放到GroupEntity仓库中,但是不起作用。 我究竟做错了什么 ?
[...]获取所有HostEntity.myGroup(我们称其为ListA),使得HostEntity.inGroupSince在startTime和finishTine之间[...]
SELECT myGroup FROM HostEntity WHERE inGroupSince > startTime AND inGroupSince < finishTime
[...]然后,返回所有GroupEntity.groupId,以使GroupEntity.groupdId位于ListA中。[...]
使用上面的SELECT作为内部选择:
SELECT groupId FROM GroupEntity
WHERE
groupId IN (SELECT myGroup FROM HostEntity WHERE inGroupSince > startTime AND inGroupSince < finishTime)
[...]和GroupEntity.propertiesStr包含stringA和StringB [...]
添加喜欢:
SELECT groupId FROM GroupEntity
WHERE
groupId IN (SELECT myGroup FROM HostEntity WHERE inGroupSince > startTime AND inGroupSince < finishTime)
AND propertiesStr LIKE '%stringA%'
AND propertiesStr LIKE '%stringB%'
好吧! 得到它的工作!
使用以下查询:
@Query("select ge from GroupEntity ge where ge.groupId in ( select k.myGroup from HostEntity k where k.inGroupSince > ?1 and k.inGroupSince < ?2 ) "
+ "and ge.propertiesStr like %?3% and ge.propertiesStr like %?4% and ge.propertiesStr like %?5% and ge.propertiesStr like %?6% and ge.propertiesStr like %?7% "
+ "and ge.propertiesStr like %?8% and ge.propertiesStr like %?9% and ge.propertiesStr like %?10% and ge.propertiesStr like %?11% and ge.propertiesStr like %?12% "
+ " and ge.propertiesStr like %?13%")
List<GroupEntity> findGrpWithPropertiesBetweenTime(long st,long ft,String property1,String property2,String property3,String property4,String property5,String property6
,String property7,String property8,String property9,String property10,String property11);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.