Я пытаюсь написать общий класс DAO, который принимает динамические предикаты.
В моем классе BaseDAO я создаю PathBuilder
, чтобы добавить некоторые предикаты, используя следующий конструктор: PathBuilder<Q> entityPath = new PathBuilder<Q>(clazz, "entity");
При выполнении я получаю следующее исключение:
2019-06-06 17: 55: 11.779 ОШИБКА 11212 --- [http-nio-8080-exec-2] oaccC [. [.[/].[dispatcherServlet]: Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] вызвала исключение [Ошибка обработки запроса;вложенное исключение: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: Неверный путь: 'entity.id' [выбрать элемент 1 из com.example.clientcachedemo.Member member1 где entity.id =? 1];вложенным исключением является java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: неверный путь: 'entity.id' [выберите member1 из com.example.clientcachedemo.Member member1, где entity.id =? 1]]с основной причиной
org.hibernate.hql.internal.ast.QuerySyntaxException: Неверный путь: «entity.id» [выберите member1 из com.example.clientcachedemo.Member member1, где entity.id =? 1]
Кажется, что hibernate использовал 'member1' в качестве псевдонима таблицы при создании HQL.Если я изменю создание PathBuilder на PathBuilder<Q> entityPath = new PathBuilder<Q>(clazz, "member1");
, все будет работать хорошо, но это должен быть общий код.
Как вывести псевдоним таблицы, которую используют в спящем режиме?
Как можноЯ заставляю Hibernate использовать другой псевдоним («сущность»)?
Базовый объект:
public abstract class BaseEntity implements Serializable {
private static final long serialVersionUID = -5322749711870322616L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id", nullable = false, columnDefinition = "BIGINT UNSIGNED")
protected Long id;
@UpdateTimestamp
public Timestamp timestamp;
@Version
Long version;
}
Элемент участника
@Data
@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "MEMBERS", indexes = { @Index(name = "ix1", unique = false, columnList = "timestamp") })
public class Member extends BaseEntity {
private static final long serialVersionUID = -3641904361081907333L;
private String name;
private String city;
private String email;
private String gender;
private String hour;
private String title;
}
BaseDAO
public class BaseDAO<E extends BaseEntity, Q extends EntityPath<?>> {
@Autowired
BaseQDSLRepository<E, Q> repository;
public Iterable<E> query(RestCriteria criteria) {
Class<E> clazz = getEntityClass();
PathBuilder<E> entityPath = new PathBuilder<E>(clazz, "entity");
Predicate p = entityPath.get("id").eq(1L); // TODO Parse criteria to predicate...
return repository.findAll(p);
}
@SuppressWarnings({ "unchecked" })
protected Class<E> getEntityClass() {
Class<E> clazz = null;
Type[] genericTypes = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
if (genericTypes[0] instanceof ParameterizedType) {
clazz = (Class<E>) ((ParameterizedType) genericTypes[1]).getRawType();
} else {
clazz = (Class<E>) genericTypes[0];
}
return clazz;
}
}
BaseQDSLRepository
@NoRepositoryBean
public interface BaseQDSLRepository<E extends BaseEntity, Q extends EntityPath<?>>
extends BaseJpaRepository<E>, QuerydslPredicateExecutor<E>, BinderCustomizer<Q> {
}
Контроллер
@PostMapping
@ResponseBody
public Iterable<Member> query(@RequestBody RestCriteria criteria) {
Iterable<Member> mems = dao.query(criteria);
return mems;
}