Boa noite Raphael, tudo bem?
Para mapear chaves compostas, você deve criar uma classe que represente a composição de uma chave primária. Por ser uma composição, no seu banco de dados a PK pode ser por exemplo duas colunas do tipo NUMBER, ou uma VARCHAR e outra NUMBER e assim por diante... Ou seja, você precisa representar essa combinação.
Vamos supor que você tenha uma tabela assim:
ITEM_PEDIDO
- id_pedido NUMBER
- indice_item NUMBER
- tipo VARCHAR
- qtde NUMBER
- valor_unitario NUMBER
E na tabela ITEM_PEDIDO, a PK é a composição entre id_pedido e indice_item.
Nesse caso, você primeiro tem que criar a classe que represente a PK da tabela ITEM_PEDIDO. Segue exemplo:
import java.io.Serializable;
import javax.persistence.Embeddable;
@Embeddable
public class ItemPedidoID implements Serializable {
private Long idPedido;
private Integer indiceItem;
//construtor default
//gettes e setters
//hashcode e equals
}
E na sua classe ItemPedido
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
@Entity
public class ItemPedido {
@EmbeddedId
private ItemPedidoID itemPedidoID;
private String tipo;
private BigDecimal qtde;
private BigDecimal valorUnitario;
//construtor default
//getters e setters
}
Daí, via JPQL, você faz:
from ItemPedido ip
where ip.itemPedidoID.idPedido = :idPedido
and ip.itemPedidoID.indiceItem = :indice
Mais detalhes na documentação oficial:
https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite
Abraços!