Spring Boot, JPA / Hibernate: Как выполнить два необработанных запроса SELECT одновременно? - PullRequest
0 голосов
/ 05 марта 2020

Когда я пытаюсь выполнить два оператора SELECT одновременно, как указано ниже, консоль ведения журнала возвращает ошибку времени выполнения:

java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM ...

Исходный код Java, который генерирует операторы:

@Repository
public class VehicleObjectDbAccess {
    @PersistenceContext
    EntityManager entityManager;

    public List<Object[]>  getObjectById(long objectId, long year)     
    {
        int limit = 10;
        String tableName = ("i0i"+year)+objectId;
        String queryText =
            "START TRANSACTION;"
            + "SELECT t.created INTO @startTime FROM ObjectTable as t WHERE t.speed > 30 LIMIT 1;"
            + "SELECT * FROM ObjectTable WHERE created <= (CASE WHEN @startTime IS NULL THEN NOW() ELSE @startTime END) ORDER BY created DESC LIMIT 10;"
            + "COMMIT;";

        Query query = this.entityManager.createNativeQuery(queryText);
        return query.getResultList();
    }
}

В конечном итоге приведенный выше исходный код java преобразуется в

START TRANSACTION; 
SELECT t.created INTO @startTime FROM ObjectTable as t WHERE t.speed > 30 LIMIT 1;
SELECT * FROM ObjectTable WHERE created <= (CASE WHEN @startTime IS NULL THEN NOW() ELSE @startTime END) ORDER BY created DESC LIMIT 10; 
COMMIT;

. Я убедился, что код SQL работает на клиенте MySQL и работает правильно .

Как я могу выполнить эти два SELECT оператора в одном запросе?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Просто используйте один оператор выбора:

SELECT *, (SELECT t.created FROM ObjectTable as t WHERE t.speed > 30 LIMIT 1) as x FROM ObjectTable WHERE created <= 
  (CASE WHEN x IS NULL THEN NOW() 
   ELSE x
  END) 
  ORDER BY created DESC LIMIT 10;

Если вы по какой-то причине не хотите этого делать, создайте хранимую процедуру, которая возвращает набор результатов, и вызовите ее ...

1 голос
/ 05 марта 2020

Кажется, что вы можете разделить ваш составной sql запрос на два отдельных запроса SELECT:

 Query query1 = this.entityManager.createNativeQuery(queryText1);
 Query query2 = this.entityManager.createNativeQuery(queryText2);

После этого вы можете получить из них списки результатов и добавить списки результатов в один составной список:

 List<Object[]> result = new ArrayList<>();
 result.addAll(query1.getResultList());
 result.addAll(query2.getResultList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...