Use a join table (also called chain table) to define n-m relations.
User table (pseudo-SQL):
CREATE TABLE user {
id INTEGER GENERATED PRIMARY KEY,
name VARCHAR
}
Language table (pseudo-SQL):
CREATE TABLE language {
id INTEGER GENERATED PRIMARY KEY,
name VARCHAR
}
Join table for users and languages (pseudo-SQL):
CREATE TABLE user_language {
user_id INTEGER FOREIGN KEY REFERENCES user(id),
language_id INTEGER FOREIGN KEY REFERENCES language(id)
}
This way you can just get all languages by user ID (and all users which are tied to a specific language). Some RDBMS supports retrieval of those values as a SQL ARRAY type which you in turn can obtain by ResultSet#getArray()
in a single query. In PostgreSQL for example you can do the following query:
SELECT u.id, u.name, ARRAY(
SELECT l.name
FROM language l
JOIN user_language ul ON u.id = ul.user_id
WHERE l.id = language_id) AS languages
FROM user u
which you can handle in JDBC as follows:
while (resultSet.next()) {
Long id = resultSet.getLong("id");
String name = resultSet.getString("name");
Object[] languages = resultSet.getArray("languages").getArray();
// Cast to String[] or convert to List<String> or so yourself.
}