как использовать CriteriaQuery с CollectionTable и JoinColumn - PullRequest
0 голосов
/ 07 февраля 2020

Как настроить CriteriaQuery, чтобы правильно получить сущность? Я должен выбрать выбранные столбцы

Я использую spring boot 2.2.2.RELEASE, spring-data-jpa 2.2 и hibernate 5.4.9.Final.

Моя сущность:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "uuid2")
    @Column(name = "CLIENT_VER_ID", columnDefinition = "UUID")
    private UUID clientVerId;
    @ElementCollection
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "uuid2")
    @CollectionTable(name = "T_OBJECT", joinColumns = @JoinColumn(name = "CLIENT_VER_ID",
            columnDefinition = "UUID", referencedColumnName = "CLIENT_VER_ID"))
    @MapKeyColumn(name = "KEY_COLUMN", columnDefinition = "CHAR(40)")
    @Column(name = "VALUE_COLUMN", columnDefinition = "UUID")
    private Map<String, UUID> objectIdMap;
    @ElementCollection
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "uuid2")
    @CollectionTable(name = "T_NAME", joinColumns = @JoinColumn(name = "CLIENT_VER_ID",
            columnDefinition = "UUID", referencedColumnName = "CLIENT_VER_ID"))
    @MapKeyColumn(name = "KEY_COLUMN", columnDefinition = "CHAR(40)")
    @Column(name = "VALUE_COLUMN", columnDefinition = "VARCHAR(255)")
    private Map<String, String> nameMap;
    @ElementCollection
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "uuid2")
    @CollectionTable(name = "T_CLASS", joinColumns = @JoinColumn(name = "CLIENT_VER_ID",
            columnDefinition = "UUID", referencedColumnName = "CLIENT_VER_ID"))
    @MapKeyColumn(name = "KEY_COLUMN", columnDefinition = "CHAR(40)")
    @Column(name = "VALUE_COLUMN", columnDefinition = "UUID")
    private Map<String, UUID> classIdMap;

    public OutPacket(Long id, UUID bindId, UUID clientVerId, Map<String, UUID> objectIdMap, Map<String,
            UUID> classIdMap, Map<String, String> nameMap, String comment) {
        this.id = id;
        this.bindId = bindId;
        this.clientVerId = clientVerId;
        this.objectIdMap = objectIdMap;
        this.classIdMap = classIdMap;
        this.nameMap = nameMap;
        this.comment = comment;
    }

    ...

    getters and setters

}

и мой сервис

    @PersistenceContext
    private EntityManager em;

    private final PacketRepository packetRepository;

    public PacketServiceImpl(PacketRepository packetRepository) {
        this.packetRepository = packetRepository;
    }

    @Override
    public List<OutPacket> getPackets() {

        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<OutPacket> outPacketCriteria = cb.createQuery(OutPacket.class);
        Root<OutPacket> outPacketRoot = outPacketCriteria.from(OutPacket.class);
        outPacketCriteria.multiselect(outPacketRoot.get("id")
                outPacketRoot.get("clientVerId"), outPacketRoot.get("objectIdMap"),
                outPacketRoot.get("classIdMap"), outPacketRoot.get("nameMap"));
        Predicate criteria = cb.conjunction();
        Predicate p = cb.equal(outPacketRoot.get("isSent"), false);
        criteria = cb.and(criteria, p);
        outPacketCriteria.where(criteria);
        return em.createQuery(outPacketCriteria).getResultList();
    }
}

ошибка:

"Ошибка обработки запроса; вложенное исключение: java .lang.NullPointerException",

...