我有两个表,由两个实体表示:

        @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个字符串

更新

我按照以下建议使用以下内容:

    @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%'

09-25 21:22