Hi,
I have an entity "User", which has a OneToMany relationship to its communication data.
Code:
@Entity
public class User
{
....
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<CommunicationData> getCommunicationData() {
return communicationData;
}
public void setCommunicationData(Set<CommunicationData> communicationData) {
this.communicationData = communicationData;
}
}
So, a user can have several communictation data, like phone, email, IM, ...
The CommunicationData entity has just a "type" and "data" property.
I want to search a user by example.
Code:
Criteria userCriteria = session.createCriteria(User.class);
Example userExample = Example.create(user);
userCriteria.add(userExample);
return userCriteria.list();
This works for a "simple" user example.
However, I also want to find a user by his email-address and/or phone number.
I added this:
Code:
if (user.getCommunicationData() != null && user.getCommunicationData().size() > 0) {
Criteria communicationCriteria = userCriteria.createCriteria("communicationData");
for (CommunicationData communicationData : user.getCommunicationData()) {
Example communicationExample = Example.create(communicationData);
communicationCriteria.add(communicationExample);
}
}
But it didn't work. I recognized, that the query does not contain any WHERE clause which compares the example.
I ended up adding
Code:
communicationCriteria.add(Restrictions.eq("data", communicationData.getData()));
communicationCriteria.add(Restrictions.eq("type", communicationData.getType()));
but it seems, this is just a bad workaround (since it is not really "by example" anymore). Happily, the entity only has 2 properties.
It works, as long I only add the email address, to the example. When I also want to search for phone, it doesn't work anymore, due to this SQL:
Code:
and communicat1_.data=?
and communicat1_.type=?
and (
communicat1_.type=?
)
and communicat1_.data=?
and communicat1_.type=?
and (
communicat1_.type=?
)
Do you have any idea, how to better solve this problem? Thanks.