Оказывается, проблема заключается в том, что не используются разделители. Чтобы операторы успешно анализировали разделители, следует использовать их следующим образом:
DELIMITER //
CREATE TRIGGER my_cool_trigger
BEFORE UPDATE ON my_db
FOR EACH ROW
BEGIN
DECLARE n INT;
SET n = (SELECT COUNT(uuid) FROM my_db WHERE uuid != NEW.uuid AND a_uuid = NEW.a_uuid AND number = NEW.number AND event_id IS NULL AND t_begin < NEW.t_end AND t_end > NEW.t_begin);
IF n > 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='Oof. ERROR!!!';
END IF;
END//
DELIMITER ;
Причина, по которой это сработало в Java, заключалась в том, что Java prepareStatement, кажется, добавляет пользовательские разделители или что-то еще .. .