JPA: Как выбрать двоичный (16) UUID с помощью String UUID? - PullRequest
1 голос
/ 05 августа 2020

У меня есть следующая сущность:

@Data
@Entity
public class Comment implements Serializable {

    @Id
    @GeneratedValue(generator = "uuid4")
    @GenericGenerator(name = "UUID", strategy = "uuid4")
    @Column(columnDefinition = "BINARY(16)")
    private UUID id;

    @Column(columnDefinition = "BINARY(16)")
    private UUID imageId;

    private Instant creationTime;

    private String text;
}

И репозиторий CRUD:

public interface CommentsRepository extends CrudRepository<Comment, UUID> {

    List<Comment> findAllByImageId(final UUID imageId);
}

Я добавляю несколько примеров данных:

@Component
@Slf4j
public class CommentsSampleData implements CommandLineRunner {

    private final CommentsRepository repository;

    @Autowired
    public CommentsSampleData(final CommentsRepository repository) {
        this.repository = repository;
    }

    @Override
    public void run(String... args) {
        createComment("617220ff-1642-4490-b589-869e7978c5e0", Instant.now(), "comment1");
        createComment("617220ff-1642-4490-b589-869e7978c5e0", Instant.now(), "comment2");
        createComment("617220ff-1642-4490-b589-869e7978c5e0", Instant.now(), "comment3");
        createComment("e3a8aa57-6937-4f9e-b117-78bafe61b718", Instant.now(), "comment1");
    }

    private void createComment(
            final String imageId,
            final Instant creationTime,
            final String text) {
        final Comment comment = new Comment();
        comment.setImageId(UUID.fromString(imageId));
        comment.setCreationTime(creationTime);
        comment.setText(text);

        log.info("save comment: {}", comment);

        repository.save(comment);
    }
}

Итак, данные в моей таблице выглядит так:

введите описание изображения здесь

Итак, какой теперь лучший способ выбрать по этим двоичным UUID? Я получу строковые UUID из внешнего интерфейса. Итак, я думаю, мне нужно как-то преобразовать эти строки в двоичные файлы. Как лучше всего это сделать, чтобы он также работал с идентификаторами и первичными ключами.

Пример конечной точки:

@Slf4j
@RestController
public class CommentsController {

    private final CommentsService service;

    public CommentsController(final CommentsService service) {
        this.service = service;
    }

    @GetMapping(value = "/comments", produces = MediaType.APPLICATION_JSON_VALUE)
    public List<Comment> getComments(@RequestParam("imageId") final UUID imageId) {
        log.info("get comments by imageId: {}", imageId);

        String existingIds = service.findAll().stream()
                .map(Comment::getImageId)
                .map(UUID::toString)
                .collect(Collectors.joining(","));

        log.info("Image Id Passed: {}", imageId);
        log.info("Existing image ids: {}", existingIds);

        String resultIds = service.findAllByImageId(imageId).stream()
                .map(Comment::getImageId)
                .map(UUID::toString)
                .collect(Collectors.joining(","));

        log.info("Result image ids: {}", resultIds);

        return service.findAllByImageId(imageId);
    }
}

Когда я сейчас делаю запрос:

localhost:8080/comments?imageId=617220ff-1642-4490-b589-869e7978c5e0

Я не получаю результата, хотя UUID существует, но не как строка, он существует как двоичный (16) в базе данных:

d.f.a.c.service.CommentsController       : Image Id Passed: 617220ff-1642-4490-b589-869e7978c5e0
d.f.a.c.service.CommentsController       : Existing image ids: 617220ff-1642-4490-b589-869e7978c5e0,617220ff-1642-4490-b589-869e7978c5e0,617220ff-1642-4490-b589-869e7978c5e0,e3a8aa57-6937-4f9e-b117-78bafe61b718
d.f.a.c.service.CommentsController       : Result image ids:

1 Ответ

1 голос
/ 06 августа 2020
  • Он работает должным образом, без каких-либо проблем, и он автоматически конвертируется между UUID и двоичным кодом.

  • Я рекомендую попробовать следующее, чтобы убедиться, что идентификатор действительно существует в базе данных.

    @GetMapping(value = "/comments", produces = MediaType.APPLICATION_JSON_VALUE)
    public Iterable<Comment> getComments(@RequestParam("imageId") 
                                          final UUID imageId) {
        log.info("get comments by imageId: {}", imageId);

        String existingIds = service.findAll()
                .map(Comment::getImageId)
                .map(UUID::toString)
                .collect(Collectors.joining(","));
        
        log.info("Image Id Passed : {}", imageId);
        log.info("Existing image ids : {}", existingIds);

        return service.findAllByImageId(imageId);
    }
...