Если предположить, что DATE - это временная метка, о которой вы не беспокоитесь о столкновении, кажется, что ваш запрос может быть таким простым, как
select mpd
from MyProfileData mpd
where mpd.profile.name = :name
and mpd.date = (select max(mpd1.date) from MyProfileData mpd1 where mpd1.profile.name = :name)
Используете ли вы СУБД, как более старый MySQL, который ненавидит подвыборы?
Я также думаю, что, возможно, ваша проблема в том, что вы не отобразили отношение объекта из MyProfileData в ProfileData, и все, что у вас есть, - это фактическое целочисленное значение поля. В общем, это затруднит написание JPQL-запросов.
Edit:
Продолжая исходить из предположения, что даты не совпадают для какого-либо конкретного профиля + комбинированный тип данных профиля (таким образом, дата однозначно определяет строку в подмножестве определенной комбинации профиль + тип профиля), вы можете просто захватить все даты :
select mpd from MyProfileData
where mpd.profile.name = :name
and mpd.date in (select max(mpd1.date)
from MyProfileData mpd1
where mpd1.profile = mpd.profile group by mpd.profileDataType)
Ваш исходный пример SQL на самом деле недопустим, поэтому сложно придумать способ воспроизвести то, на что он похож, что пытается сделать, без способа уникальной идентификации строк, исключая значение.