Оставить соединение на несвязанных лицах, используя критерии API - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно заменить приведенный ниже запрос sql, оставив объединение для 2 таблиц с двумя одинаковыми типами столбцов, используя API построителя критериев, и я получаю следующую ошибку при запуске программы

org. hibernate.query.criteria.internal.BasicPathUsageException: Невозможно присоединиться к атрибуту типа basi c.

Я проверил несколько блогов, примеров, но не смог получить большую помощь.

запрос, который необходимо заменить:

SELECT connection_name, connection_date, connection_role, a.code, a.box FROM test.connections a LEFT JOIN test.samples b ON a.code = b.code AND a.box = UPPER(b.box) WHERE connection_name = ? AND connection_date = ? OFFSET ? LIMIT ?;

Connections entity class 

@Entity
@Table(name = "connections", schema = "test")
public class Connections implements Serializable {
    private static final long serialVersionUID = 3940341617988134707L;

    @Id
    @Column(name = "connection_name")
    private String ConnectionName;

    @Id
    @Column(name = "connection_date")
    private Date ConnectionDate;

    @Id
    @Column(name = "code")
    private String Code;

    @Id
    @Column(name = "box")
    private String box;

    public Connections() {}

 }

Samples entity class

@Entity
@Table(name = "samples", schema = "test")
public class Samples implements Serializable {
    private static final long serialVersionUID = 3940341617988134707L;

    @Id
    @Column(name = "connection_role")
    private String ConnectionRole;

    @Id
    @Column(name = "code")
    private String Code;

    @Id
    @Column(name = "box")
    private String box;

    public Samples() {}
 }

My implementation using criteria api. 
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<SampleDTO> criteriaQuery = criteriaBuilder.createQuery(SampleDTO.class);
Root<Connections> root = criteriaQuery.from(Connections.class);

Join<Connections, Samples> joinCode = root.join("code", JoinType.LEFT);
Join<Connections, Samples> joinBox = root.join("box".toUpperCase(), JoinType.LEFT);

List<Predicate> criteriaList = new ArrayList<>();

Predicate firstCondition = criteriaBuilder.equal(root.get("connection_name"), connectionName);
            criteriaList.add(firstCondition);

Predicate secondCondition = criteriaBuilder.equal(root.get("connection_date"), connectionDate);
            criteriaList.add(secondCondition);

Timestamp sqlTimeStamp = epochToSQLTimeStamp(from);

criteriaQuery.where(criteriaBuilder.and(criteriaList.toArray(new Predicate[0])));
criteriaQuery.multiselect(root.get("connection_name"), root.get("connection_date"), root.get("connection_role"), root.get("code"), root.get("box"));

List<SampleDTO> results = entityManager.createQuery(criteriaQuery).setFirstResult(offset).setMaxResults(count).getResultList();

...