无法将计数值设置为列

时间:2019-03-13 18:14:09

标签: android sql database android-room

我正在尝试获取机架中具有一定数量组件的组件类别。

查询

@Query("SELECT id, name, component_amount = " +
        "       (SELECT COUNT(component.id) as amount " +
        "        FROM component " +
        "        WHERE component.rack_id = :rackID AND component_cat.id = component_cat_id ) " +
        "FROM component_cat")
LiveData<List<ComponentCat>> getRackComponentCategories(long rackID);

ComponentCat

public class ComponentCat
{
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    public long componentCatID;

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

    @ColumnInfo(name = "component_amount")
    private int amountOfComponents;


    public ComponentCat(String componentCatName, int amountOfComponents) {
        this.componentCatName = componentCatName;
        this.amountOfComponents = amountOfComponents;
    }

在PHPMyAdmin中对其进行测试是可行的,但是将此SQL放入Room应用程序中时,出现以下错误:

  error: The columns returned by the query does not have the fields [amountOfComponents] in com.mwb.digitalstorage.model.ComponentCat even though they are annotated as non-null or primitive. Columns returned by the query: [id,name,component_amount =        (SELECT COUNT(component.id) as amount         FROM component         WHERE component.rack_id = :rackID AND component_cat.id = component_cat_id )]

在会议室中,如何将变量amountOfComponents设置为COUNT()的结果?

我尝试过:

  • 具有COUNT(component.id)作为component_amount,但是这样的结果不能给出正确的结果
  • 在MySQL中重新创建表并执行相同的查询,但这确实给出了正确的结果
  • 在字段上删除@NonNull,没有区别
  • 分配component_amount.amount

    @Query(“ SELECT id,name,component_amount.amount =” +         “(选择COUNT(component.id)作为数量” ...

    这不会建立

1 个答案:

答案 0 :(得分:2)

Room不支持为列指定别名。

您的错误消息状态:

Columns returned by the query: [id,name,component_amount =        (SELECT COUNT(component.id) as amount         FROM component         WHERE component.rack_id = :rackID AND component_cat.id = component_cat_id )

这意味着它将整个查询解释为一列。

尝试将查询更改为以下内容:

@Query("SELECT id, name, " +
        "       (SELECT COUNT(component.id) as amount " +
        "        FROM component " +
        "        WHERE component.rack_id = :rackID AND component_cat.id = component_cat_id ) as component_amount " +
        "FROM component_cat")
LiveData<List<ComponentCat>> getRackComponentCategories(long rackID);