First, if possible, avoid composite ids at all costs. But if you really need, I would recommend @EmbeddedId.
@IdClass is basically a leftover from EJB 2.1 times to make it easier from migrating from BMP. In some other rare corner cases it may be better than @EmbeddedId too. However, generally @EmbeddedId is better and more OO since it encapsulates the concept os the key much better in the object.
You may want to use @AttributeOverride(s) if you need in the key field.
I don't see why do you think that dereferencing the embedded id is redundant and error-prone.