Случай Querydls, когда перечисление: не удалось определить сопоставление значений для SqmParameter ⇐ JAVA

Программисты JAVA общаются здесь
Anonymous
Случай Querydls, когда перечисление: не удалось определить сопоставление значений для SqmParameter

Сообщение Anonymous »

У меня есть запрос, сделанный с помощью querydsl, в запросе я извлекаю поле как перечисление, но при выполнении запроса выдается эта ошибка:

Код: Выделить всё

org.hibernate.query.sqm.sql.ConversionException: Could not determine ValueMapping for SqmParameter: SqmPositionalParameter(2)
Похоже, проблема связана с преобразованием перечисления. Запрос примерно такой:

Код: Выделить всё

query.select(new QTestDto(qTE.id,
Expressions.cases()
.when(qTE.code.startsWith("A"))
.then(TestType.GOOD)
.otherwise(TestType.BAD)))
.from(qTE)
.fetch();
Если я изменю проецируемые объекты TestDto, используя строку вместо перечисления, и изменю извлечение с помощью toString(), это сработает, но я хотел бы использовать непосредственно перечисление.< /p>
Это модульный тест для воспроизведения ошибки:

Код: Выделить всё

import com.querydsl.core.annotations.QueryProjection;
import com.querydsl.core.types.ConstructorExpression;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.PathMetadata;
import com.querydsl.core.types.dsl.EntityPathBase;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.core.types.dsl.StringPath;
import com.querydsl.jpa.impl.JPAQuery;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import java.io.Serial;

import static com.querydsl.core.types.PathMetadataFactory.forVariable;
import static org.assertj.core.api.Assertions.assertThat;

@DataJpaTest
class CaseBuilderTest {

@Autowired
private EntityManager em;

@Test
void test() {

// given
em.persist(new TestEntity(1L, "A003", "Description ..."));
em.persist(new TestEntity(2L, "B538", "Description ..."));

// when
var qTE = QTestEntity.testEntity;
var query = new JPAQuery(em);
var result = query.select(new QTestDto(qTE.id,
Expressions.cases()
.when(qTE.code.startsWith("A"))
.then(TestType.GOOD)
.otherwise(TestType.BAD)))
.from(qTE)
.fetch();

// then
assertThat(result).hasSize(2);
}

@Getter
@Setter
public static class TestDto {
private Long id;
private TestType type;

@QueryProjection
public TestDto(Long id, TestType type) {
this.id = id;
this.type = type;
}
}

@Entity
@AllArgsConstructor
@NoArgsConstructor
public static class TestEntity {
@Id
@Column
private Long id;
@Column
private String code;
@Column
private String description;
}

public enum TestType {
GOOD,
BAD;
}

// Generated
public static class QTestEntity extends EntityPathBase {
@Serial
private static final long serialVersionUID = 1L;
public static final QTestEntity testEntity = new QTestEntity("testEntity");
public final StringPath code = createString("code");
public final StringPath description = createString("description");
public final NumberPath id = createNumber("id", Long.class);

public QTestEntity(String variable) {
super(TestEntity.class, forVariable(variable));
}

public QTestEntity(Path[] {long.class, TestType.class}, id, type);
}

}

}
Что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/791 ... mparameter

Вернуться в «JAVA»