Динамический QueryDSL построитель запросов - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь написать общий класс 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;
}
...