Based on what you described, my solution would be to have
Code:
Language Table:
Id
Language
Person Table
Id
LanguageRef -FK to Language Table
State Table
Id
LanguageRef - FK to Language Table
This will allow you to find what you're looking for. Though based on the example, I'm not sure why you would need the state table. If the concern is that you want to find a person who speaks a particular language; then the lookup would be done on the language table. To which there is a valid reason to have the association at this point.
If criteria searching is what you're wanting to do, then this will work. However IMHO don't base your data model on the solution. If your tables are Person and State and they don't have a relationship to each other, then the best bet is to use an HQL query to get what you're looking for. The same search that can be done using Criteria objects, can be done in HQL.
-B