o.s.d.jpa.repository.query.NamedQuery : Did not find named query … в многомодульном проекте

У меня многомодульный проект (*.war).

Точка входа.

@SpringBootConfiguration
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"....dao.repository"})
@EntityScan(basePackages = {"....dao.model"})
@ComponentScan(basePackages = {"..."})
public class ApsTtsApplication
        extends SpringBootServletInitializer
        implements WebApplicationInitializer {

    private static final Logger LOGGER  = LoggerFactory.getLogger( ApsTtsApplication.class );

    public static void main(String[] args) {

        LOGGER.info("Start an application...");

        SpringApplication.run(ApsTtsApplication.class, args);
    }


    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {

        LOGGER.info("There is building the web application!");

        return builder.sources(ApsTtsApplication.class);
    }
}

model

  • IdMainForEntities
@MappedSuperclass
public abstract class IdMainForEntities {

    @Id
    @GenericGenerator(name="system-uuid", strategy = "uuid")
    @GeneratedValue(generator="system-uuid")
    @Column(name = "id", nullable = false)
    private String ID;

    public IdMainForEntities() {
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        IdMainForEntities that = (IdMainForEntities) o;
        return Objects.equals(ID, that.ID);
    }

    @Override
    public int hashCode() {
        return Objects.hash(ID);
    }

    @Override
    public String toString() {
        return "IdMainEntity{" +
                "ID='" + ID + '\'' +
                '}';
    }
}
  • MessageLog

@Entity
@Table(name = "MESSAGESLOG")
public class MessageLog extends IdMainForEntities {
...

    @Column(name = "MSG_OWNER_ID")
    @Size(message = "MSG_OWNER_ID{MessagesLog.size}", max = 32)
    private String msgOwnerId;

  public MessageLog() {
    }

  public String getMsgOwnerId() {
        return msgOwnerId;
    }

    public void setMsgOwnerId(String msgOwnerId) {
        this.msgOwnerId = msgOwnerId;
    }

....


}

  • MessagesLogReadRepository
public interface MessagesLogReadRepository extends CrudRepository <MessageLog, String> {

    Optional <MessageLog> findByMsgOwnerId(String msgOwnerId);

    MessageLog findMessageLogByMsgOwnerId(String msgOwnerId);

    Optional <MessageLog> findByDocument(String documentId);

}

Но у репозитория можно запросить только корректно стандартые метода findById () и т.д.

И я получу нормальный результат.

Но методы, которые будут составлять именованный запрос, возвращают null и не выдают ошибок.

18-03-2020 08:49:39.531 DEBUG 8660 o.s.d.j.r.query.JpaQueryFactory
: Looking up query for method findByMsgOwnerId 18-03-2020 08:49:39.547 DEBUG 8660 o.s.d.jpa.repository.query.NamedQuery : Looking up named query MessageLog.findByMsgOwnerId 18-03-2020 08:49:39.547 DEBUG 8660 o.h.e.t.internal.TransactionImpl : On TransactionImpl creation, JpaCompliance#isJpaTransactionComplianceEnabled == false 18-03-2020 08:49:39.547 DEBUG 8660 o.s.d.jpa.repository.query.NamedQuery : Did not find named query MessageLog.findByMsgOwnerId

@Override
    public MessageLogDto getByMsgOwnerId(String msgOwnerId) {

 if(msgOwnerId == null) throw  new MessagesLogException(paramNotNull);

/*It's null*/
        Optional<MessageLog> byMsgOwnerId = this.messagesLogReadRepository.findByMsgOwnerId("8a00844170d829040170d82c670b00");
        MessageLog messageLog = byMsgOwnerId.orElse(new MessageLog());
     /*It's OK*/
        Optional<MessageLog> byId = this.messagesLogReadRepository.findById("8a00844170d829040170d82c670b0003");

        return transformEntityToDto(messageLog);

       }

Но запрашиваемые данные точно есть в таблице, я проверял из командной строки.

Я также использовал

   @Query(value = "SELECT * from messageslog where msg_owner_id = ?1 ", nativeQuery = true )

Кто знает в чем проблема ?


Ответы (1 шт):

Автор решения: skyho

Решение

Поле, с которым мы работали, имело тип данных CHAR(32 байта). Мы изменили этот тип на VARCHAR (32 байта) в таблице базы данных Oracle.

Теперь Spring может построить именованный запрос нормально.

Проект на старых версиях Spring работал именно так ...(CHAR(32 байта))

Я не понимаю, почему это так.

→ Ссылка