Стоит ли бросать кастомные ошибки
Да. Фронту совершенно не нужно знать, что там и как на уровне репозитария организовано.
меня в нем беспокоит только конкатенация строк
Так не конкатенируй.
Используй String.format()
throw new ApiException(String.format("Vote with id %d is not in DB", voteId));
либо, если ApiException твой, спрячь эту логику вообще в конструктор
public ApiException(String format, Object... parameters) {
...
}
и бросай исключение как
throw new ApiException("Vote with id %d is not in DB", voteId);