Странное поведение Spring JPA при использовании @Query

#java #spring-data-jpa

#java #spring-data-jpa

Вопрос:

Сейчас с аннотацией @Query происходит что-то странное, я пытаюсь извлечь некоторые конкретные поля из таблицы, используя список пользователей в качестве входных данных:

 @Query(value = "select new document(documentId, documentType, status, rejected) "   "from document where user in ?1") 
List<Document> findByUserInWithoutFiles(List<User> users);
 

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

 @Query(value = "select new document(documentId, documentType, status, rejected, user) "   "from document where user in ?1")
List<Document> findByUserInWithoutFiles(List<User> users);
 

Но здесь выдает

java.sql.SQLSyntaxErrorException: неизвестный столбец «пользователь» в предложении where

Вот объект Document.

 @Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "document")
@Table(name = "document", schema = "foo")
public class Document implements Serializable {

  private static final long serialVersionUID = -9793924073464282L;

  @GeneratedValue(generator = "uuid2")
  @GenericGenerator(name = "uuid2", strategy = "uuid2")
  @Column(columnDefinition = "BINARY(16)", name = "document_id")
  @Id
  private UUID documentId;
  @Column(name = "document_type")
  private PhotoEnum documentType;
  @Column(name = "created_date")
  private LocalDateTime createdDate;
  @Column(name = "update_date")
  private LocalDateTime updateDate;
  @Lob
  @Column(name = "file", columnDefinition = "BLOB")
  private byte[] file;
  @Column(name = "status")
  private String status;
  @Column(name = "rejected")
  private String rejected;
  @Column(name = "expiration_date")
  private LocalDate expirationDate;
  @ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
  @JoinColumn(name = "user_id")
  private User user;

  public Document(PhotoEnum documentType) {
    this.documentType = documentType;
  }

  public Document(UUID documentId, PhotoEnum documentType, String status, String rejected,
      User user) {
    this.documentId = documentId;
    this.documentType = documentType;
    this.status = status;
    this.rejected = rejected;
    this.user = user;
    }
 

Итак, вопрос в том, что я делаю не так? это ошибка?

Есть ли другой способ получить частичную информацию из этого объекта? (Мне не нужно поле file)

Я был бы признателен за любой совет.

Приветствия!

РЕДАКТИРОВАТЬ: я провел некоторые альтернативные исследования, и в итоге я использовал проекции на основе интерфейса вместо аннотации @Query — лучшее и элегантное решение.

Ответ №1:

Я провел некоторые альтернативные исследования, и в итоге я использовал проекции на основе интерфейса вместо аннотации @Query — лучшее и элегантное решение.