2017-02-12 8 views
0

У меня есть две таблицы представлены двумя сущностями:Используйте результат запроса одной таблицы/объекта для запроса другого субъекта/таблицы

 @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 (назовём это lišta) таким образом, что HostEntity.inGroupSince является между STARTTIME и finishTine, а затем, вернуть все GroupEntity.groupId таким образом, что GroupEntity.groupdId в LISTA и GroupEntity.propertiesStr containt stringA и StringB

W шляпа будет лучшим способом достичь этого? Я могу сделать это в одном запросе?

Im работая в Spring ботинке с crudRepository и своего рода новым для него.

я могу использовать @query аннотаций в repostiroy, например, я получил следующий код:

@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 containts 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, но его не работает. Что я делаю не так ?

ответ

0
[...] получить все HostEntity.myGroup (назовём эту lišta) таким образом, что HostEntity.inGroupSince между STARTTIME и finishTine [...]
SELECT myGroup FROM HostEntity WHERE inGroupSince > startTime AND inGroupSince < finishTime 
[...], а затем, возвращение все GroupEntity.groupId такие, что GroupEntity.groupdId находится в lišta [...]

Использование выше SELECT, а внутренний выбор:

SELECT groupId FROM GroupEntity 
WHERE 
    groupId IN (SELECT myGroup FROM HostEntity WHERE inGroupSince > startTime AND inGroupSince < finishTime) 
[...] и GroupEntity.propertiesStr containt 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%' 
+0

спасибо, но в котором хранилище я должен поставить его? это не имеет значения? – nadavgam

+0

Извините, я не знакомый с Spring Boot, но использование вышеуказанного запроса с аннотацией @query, как в вашем примере, кажется правдоподобным. – hartwecm

0

Okie !!! заставил его работать!

используется следующий запрос:

@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);