问题
I m using Room to query a table from my local Android sqlite database.
I've created an abstract class Dao , and wondering if i can pass the name of columns as parameters in method like this :
@Query(value = "SELECT :columnName "
+ " from " + Constant.TABLE_NAME
)
public abstract Maybe<List<SomeEntity>> getResults(String columnName);
回答1:
No, sorry, that is not supported. Room only supports what SQLite does, and SQLite does not support parameters for column names, table names, etc.
回答2:
Can be done example at How to select a specific column from room database given a specific parameter in room query?
it does ok
@Query("WITH parms(c) AS (SELECT :columnName) " +
"SELECT COALESCE(" +
"CASE " +
"WHEN (SELECT c FROM parms) = 'column1' THEN column1 " +
"WHEN (SELECT c FROM parms) = 'column2' THEN column2 " +
"WHEN (SELECT c FROM parms) = 'column3' THEN column3 " +
"WHEN (SELECT c FROM parms) = 'column4' THEN column4 " +
"END" +
",0) AS subcategoryValue " +
"FROM subcategory_table" +
";")
float[] getSubcategory(String columnName);
or more harder like SQL at DB Fiddle become
Using
@Query("WITH parms(c1,c2,c3,c4) AS (SELECT :c1,:c2,:c3,:c4)" +
"SELECT * FROM subcategory_table WHERE " +
" CASE " +
" WHEN " +
" (SELECT c1 FROM parms) IS NOT NULL " +
" AND (SELECT c2 FROM parms) IS NULL " +
" AND (SELECT c3 FROM parms) IS NULL " +
" AND (SELECT c4 FROM parms) IS NULL" +
" THEN column1 = (SELECT c1 FROM parms)" +
" WHEN " +
" (SELECT c1 FROM parms) IS NOT NULL " +
" AND (SELECT c2 FROM parms) IS NOT NULL " +
" AND (SELECT c3 FROM parms) IS NULL " +
" AND (SELECT c4 FROM parms) IS NULL " +
" THEN column1 = (SELECT c1 FROM parms) AND column2 = (SELECT c2 FROM parms)" +
" WHEN " +
" (SELECT c1 FROM parms) IS NULL " +
" AND (SELECT c2 FROM parms) IS NOT NULL " +
" AND (SELECT c3 FROM parms) IS NULL " +
" AND (SELECT c4 FROM parms) IS NULL " +
" THEN column2 = (SELECT c2 FROM parms) " +
" WHEN " +
" (SELECT c1 FROM parms) IS NOT NULL " +
" AND (SELECT c2 FROM parms) IS NOT NULL " +
" AND (SELECT c3 FROM parms) IS NOT NULL " +
" AND (SELECT c4 FROM parms) IS NULL " +
" THEN column2 = (SELECT c2 FROM parms) AND column2 = (SELECT c2 FROM parms) AND (SELECT c3 FROM parms)" +
" WHEN " +
" (SELECT c1 FROM parms) IS NOT NULL " +
" AND (SELECT c2 FROM parms) IS NULL " +
" AND (SELECT c3 FROM parms) IS NOT NULL " +
" AND (SELECT c4 FROM parms) IS NULL " +
" THEN column1 = (SELECT c1 FROM parms) AND column3 = (SELECT c3 FROM parms)" +
" WHEN " +
" (SELECT c1 FROM parms) IS NULL " +
" AND (SELECT c2 FROM parms) IS NOT NULL " +
" AND (SELECT c3 FROM parms) IS NOT NULL " +
" AND (SELECT c4 FROM parms) IS NULL " +
" THEN column2 = (SELECT c2 FROM parms) AND column3 = (SELECT c3 FROM parms)" +
" WHEN " +
" (SELECT c1 FROM parms) IS NULL " +
" AND (SELECT c2 FROM parms) IS NULL " +
" AND (SELECT c3 FROM parms) IS NOT NULL " +
" AND (SELECT c4 FROM parms) IS NULL " +
" THEN column3 = (SELECT c3 FROM parms) " +
" WHEN " +
" (SELECT c1 FROM parms) IS NULL " +
" AND (SELECT c2 FROM parms) IS NULL " +
" AND (SELECT c3 FROM parms) IS NULL " +
" AND (SELECT c4 FROM parms) IS NOT NULL" +
" THEN column4 = (SELECT c4 FROM parms)" +
" WHEN \n" +
" (SELECT c1 FROM parms) IS NOT NULL " +
" AND (SELECT c2 FROM parms) IS NULL " +
" AND (SELECT c3 FROM parms) IS NULL " +
" AND (SELECT c4 FROM parms) IS NOT NULL " +
" THEN column1 = (SELECT c1 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
" WHEN " +
" (SELECT c1 FROM parms) IS NOT NULL " +
" AND (SELECT c2 FROM parms) IS NOT NULL " +
" AND (SELECT c3 FROM parms) IS NULL " +
" AND (SELECT c4 FROM parms) IS NOT NULL " +
" THEN column1 = (SELECT c1 FROM parms) AND column2 = (SELECT c2 FROM parms) AND column4 = (SELECT c4 FROM parms)" +
" WHEN \n" +
" (SELECT c1 FROM parms) IS NOT NULL " +
" AND (SELECT c2 FROM parms) IS NULL " +
" AND (SELECT c3 FROM parms) IS NOT NULL " +
" AND (SELECT c4 FROM parms) IS NOT NULL " +
" THEN column1 = (SELECT c1 FROM parms) AND column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
" WHEN " +
" (SELECT c1 FROM parms) IS NOT NULL " +
" AND (SELECT c2 FROM parms) IS NOT NULL " +
" AND (SELECT c3 FROM parms) IS NULL " +
" AND (SELECT c4 FROM parms) IS NOT NULL " +
" THEN column1 = (SELECT c1 FROM parms) AND column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
" WHEN " +
" (SELECT c1 FROM parms) IS NOT NULL " +
" AND (SELECT c2 FROM parms) IS NOT NULL " +
" AND (SELECT c3 FROM parms) IS NOT NULL " +
" AND (SELECT c4 FROM parms) IS NOT NULL " +
" THEN column1 = (SELECT c1 FROM parms) AND column2 = (SELECT c2 FROM parms) AND column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
" WHEN " +
" (SELECT c1 FROM parms) IS NULL \n" +
" AND (SELECT c2 FROM parms) IS NOT NULL " +
" AND (SELECT c3 FROM parms) IS NOT NULL " +
" AND (SELECT c4 FROM parms) IS NOT NULL " +
" THEN column2 = (SELECT c2 FROM parms) AND column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
" WHEN \n" +
" (SELECT c1 FROM parms) IS NULL " +
" AND (SELECT c2 FROM parms) IS NOT NULL " +
" AND (SELECT c3 FROM parms) IS NULL " +
" AND (SELECT c4 FROM parms) IS NOT NULL " +
" THEN column2 = (SELECT c2 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
" WHEN \n" +
" (SELECT c1 FROM parms) IS NULL " +
" AND (SELECT c2 FROM parms) IS NULL " +
" AND (SELECT c3 FROM parms) IS NOT NULL " +
" AND (SELECT c4 FROM parms) IS NOT NULL" +
" THEN column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms)" +
" ELSE column1 = column1" +
" END" +
";")
List<SubcategoryTable> getAccordingToColumnvalues(String c1, String c2, String c3, String c4);
Used like
subcategoryTableList = subcategoryTableDao.getAccordingToColumnvalues("13",null,null,null);
This show why this method not very good, it CASEs go up by square factor.
来源:https://stackoverflow.com/questions/48038299/room-pass-columns-name-as-parameter-in-dao-method