Подзапрос Android Room в предложении FROM не работает должным образом - PullRequest
0 голосов
/ 20 мая 2019

Я проверил свой запрос, используя https://sqliteonline.com/, но не могу заставить его работать с Android Room, и я не могу понять почему (поверьте мне, я пытался). Почему запрос в моем DAO не работает? С другой стороны, я не уверен, что это лучший способ добиться того, что я пытаюсь сделать, поэтому, пожалуйста, скажите мне, должен ли я полностью изменить свой подход.

Кроме того, я впервые задаю вопрос, извиняюсь, если опускаю что-то важное.

Я создал тестовую базу данных с sqliteonline и убедился, что мой запрос работает там. Я использую Android Room в своем проекте со следующими строками в build.gradle (приложение):

// Room components
implementation 'androidx.room:room-runtime:2.1.0-beta01'
annotationProcessor 'androidx.room:room-compiler:2.1.0-beta01'
androidTestImplementation 'androidx.room:room-testing:2.1.0-beta01'

Запрос, который работает в среде тестирования:

SELECT *,
(SELECT COUNT(*) FROM groups WHERE parent_id=a.id) AS gCount,
(SELECT COUNT(*) FROM relays WHERE parent_id=a.id) AS rCount
FROM (SELECT DISTINCT * FROM worksites) a ;

Запрос в моем DAO:

@Query("SELECT *, " +  
            "(SELECT COUNT(*) FROM relay_groups WHERE worksite_id=a.w_id) AS amountRelayGroups," +  
            "(SELECT COUNT(*) FROM relays_table WHERE worksite_id=a.w_id) AS amountRelays" +  
            "FROM (SELECT DISTINCT * FROM worksites_table) a")  
    LiveData<List<Worksites>> fetchAllWorksites();

Мои таблицы:

@Entity(tableName = "worksites_table")
    public class Worksites {

        @PrimaryKey(autoGenerate = true)
        @ColumnInfo(name = "w_id")
        private long worksite_id;

        @NonNull
        @ColumnInfo(name = "w_name")
        private String worksiteName;

        @ColumnInfo(name = "w_description")
        private String worksiteDescription;

        @Ignore
        @ColumnInfo(name = "amountRelays")
        private long amountRelays;

        @Ignore
        @ColumnInfo(name = "amountRelayGroups")
        private long amountRelayGroups;
@Entity (tableName = "relay_groups",
            foreignKeys = @ForeignKey(entity = Worksites.class,
            parentColumns = "w_id",
            childColumns = "worksite_id",
            onDelete = CASCADE))
public class RelayGroups {

    public RelayGroups(){

    }

    public RelayGroups(String name){
        this.groupName = name;
    }

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "group_id")
    private long group_id;

    @NonNull
    @ColumnInfo(name = "group_name")
    private String groupName;

    @ColumnInfo(name = "description")
    private String description;

    @NonNull
    @ColumnInfo(name = "worksite_id")
    private long worksiteId;
@Entity(tableName = "relays_table",
        foreignKeys = @ForeignKey(entity = Worksites.class,
        parentColumns = "w_id",
        childColumns = "worksite_id",
        onDelete = CASCADE))
    public class Relays implements Parcelable {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "relay_id")
    private long relayId;

    @NonNull
    @ColumnInfo(name = "relay_name")
    private String relayName;

    @NonNull
    @ColumnInfo(name = "relay_number")
    private String relayNumber;

    @ColumnInfo(name = "relay_started")
    private boolean relayOnOff;

    @NonNull
    @ColumnInfo(name = "relay_type")
    private String relayType;

    @ColumnInfo(name = "registered_master")
    private boolean registeredMaster;

    @ColumnInfo(name = "registered_user")
    private boolean registeredUser;

    @ColumnInfo(name = "security_code")
    private String securityCode;

    @ColumnInfo(name = "groups_string")
    private String groupsString;

    @NonNull
    @ColumnInfo(name ="worksite_id")
    private long worksiteId;

    @ColumnInfo(name ="description")
    private String relayDescription;

Я пытаюсь получить строки со всеми столбцами из таблицы "worksites" И счетчиком совпадающих worksite_ids в "relay_groups" и "relayys_table" -tables.

Компилятор Java поражает меня следующими ошибками / предупреждениями:

error: extraneous input '(' expecting {<EOF>, ';', K_ALTER, K_ANALYZE, K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP, K_END,   K_EXPLAIN, K_INSERT, K_PRAGMA, K_REINDEX, K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE, K_VACUUM, K_VALUES, K_WITH, UNEXPECTED_CHAR}
no viable alternative at input 'DISTINCT * FROM worksites_table)'
The query returns some columns [amountRelayGroups, amountRelays] which are not used by PACKAGE.Worksites. You can use @ColumnInfo annotation on the  fields to specify the mapping. PACKAGE.Worksites has some fields [w_description] which are not returned by the query. If they are not  supposed to be read from the result, you can mark them with @Ignore annotation. You can suppress this warning by annotating the method with @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH). Columns returned by the  query: w_name, w_id, amountRelayGroups, amountRelays. Fields in PACKAGE.Worksites: w_id, w_name, w_description.

1 Ответ

1 голос
/ 20 мая 2019

Я думаю, вы пропустили пробел до "FROM должно быть

@Query("SELECT *, " +  
            "(SELECT COUNT(*) FROM relay_groups WHERE worksite_id=a.w_id) AS amountRelayGroups," +  
            "(SELECT COUNT(*) FROM relays_table WHERE worksite_id=a.w_id) AS amountRelays" +  
            " FROM (SELECT DISTINCT * FROM worksites_table) a")
...