Reputation: 14266
I have a User
class with a field id
, so I wanted to run the following query with Room:
@Query("SELECT * FROM ticket where user_id = :user.id")
LiveData<Ticket> loadFromUser(User user);
But I am getting error marks on Android Studio on user.id
and all examples I find online only use the direct parameter of the @Query
method, usually a String
or an int
.
Is it possible to use an object's field in a Room @Query
? If positive, so what's the proper way of referencing it.
Upvotes: 45
Views: 22174
Reputation: 7603
A simple solution is to create two other functions, one is for user_id
and one is for user
as follows:
@Query("SELECT * FROM ticket where user_id = :user_id")
LiveData<Ticket> loadFromUser(String user_id);
@Transaction
LiveData<Ticket> loadFromUser(User user){
return loadFromUser(user.id);
}
Upvotes: 9
Reputation: 1376
in my case i used @RawQuery
in DAO you can write
@RawQuery
LiveData<Ticket> loadFromUser(SupportSQLiteQuery query);
and create your query and pass to it.
SimpleSQLiteQuery query = new SimpleSQLiteQuery("SELECT * FROM ticket where user_id = ?") , new Object[]{user.id})
and pass this query
to DAO method.
userDao.loadFromUser(query)
Upvotes: 5
Reputation: 4058
You can't pass parameters like that to room. It does not support a full expression language. You have to use primitive types to pass parameters. Like this,
@Query("SELECT * FROM ticket where user_id = :user_id")
LiveData<Ticket> loadFromUser(String user_id);
Upvotes: 56