uni-app中JQL联表查询有误

发布于 1周前 作者 bupafengyu 来自 Uni-App

uni-app中JQL联表查询有误

书籍信息查询及目录列表

先说下表结构:书籍book,对应多个书籍目录
需求:通过book_id查询book的信息,并查询出书籍目录列表

book.schema.json

{
  "properties": {  
    "_id": {  
      "description": "ID,系统自动生成"  
    },  
    "name": {  
      "bsonType": "string",  
      "description": "名称"  
    }
  }
}

book-chapter.schema.json

{
  "properties": {  
    "_id": {  
      "description": "ID,系统自动生成"  
    },  
    "book_id": {  
      "bsonType": "string",  
      "description": "书籍id",  
      "foreignKey": "book._id"  
    },  
    "name": {  
      "properties": "目录名称"  
    }
  }
}

理想结果

{  
  "name": "xxxx",  
  "chapter": [{  
    "name": "xxxx"
  }]
}

仅当book有数据时使用jql查询:

当book在前,bookChapter在后

const dbJQL = uniCloud.databaseForJQL()  
const book = dbJQL.collection('book').where(`_id == '${book_id}'`).getTemp();  
const bookChapter = dbJQL.collection('book-chapter').where(`book_id == '${book_id}'`).getTemp();  
const res = await dbJQL.collection(book, bookChapter).get().catch(err => {  
  console.log(err)  
});  
return res

报错:FaasError: Database error

当bookChapter在前,book在后

const dbJQL = uniCloud.databaseForJQL()  
const book = dbJQL.collection('book').where(`_id == '${book_id}'`).getTemp();  
const bookChapter = dbJQL.collection('book-chapter').where(`book_id == '${book_id}'`).getTemp();  
const res = await dbJQL.collection(book, bookChapter).get().catch(err => {  
  console.log(err)  
});  
return res

查询结果:data是[]


9 回复

现在好了吗?


没有,希望得到解答

回复 4***@qq.com: dbJQL.collection(bookChapter, book) 这样呢

回复 DCloud_uniCloud_CRL: 查询结果是空数组[]

回复 4***@qq.com: 方便的话添加我为协作者,我验证下这个问题,chenruilong@dcloud.io

回复 DCloud_uniCloud_CRL: 代码仓库协作吗?这个加不了吖,方便见一个代码吗?很少的

回复 4***@qq.com: 不是代码仓库,服务空间的协作者。

回复 4***@qq.com: 或者你自己执行以下,把云函数的requestId发给我也行

在uni-app中进行JQL(假设你指的是Java的JPQL,即Java Persistence Query Language,或者是类似的数据查询语言)联表查询时,如果遇到错误,可能是由于多种原因导致的,如语法错误、关联关系配置错误、实体类定义错误等。下面我将通过一个简单的代码案例来展示如何在Java后端进行JPQL联表查询,并解释一些常见的错误原因和解决方法。需要注意的是,uni-app本身是一个前端框架,不直接处理数据库查询,但你可以通过调用后端API来实现数据交互。

示例代码

假设我们有两个实体类:UserOrder,一个用户可以有多个订单。

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "user")
    private List<Order> orders;
    // getters and setters
}

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String product;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
    // getters and setters
}

JPQL查询

下面是一个JPQL联表查询的例子,查询每个用户及其订单信息:

public List<Object[]> findUsersAndOrders() {
    EntityManager em = entityManagerFactory.createEntityManager();
    EntityTransaction transaction = null;
    try {
        transaction = em.getTransaction();
        transaction.begin();

        String jpql = "SELECT u, o FROM User u JOIN u.orders o";
        TypedQuery<Object[]> query = em.createQuery(jpql, Object[].class);
        List<Object[]> results = query.getResultList();

        transaction.commit();
        return results;
    } catch (Exception e) {
        if (transaction != null && transaction.isActive()) {
            transaction.rollback();
        }
        e.printStackTrace();
    } finally {
        em.close();
    }
    return null;
}

常见错误及解决方法

  1. 语法错误:确保JPQL语法正确,如上例中的JOINSELECT子句。
  2. 关联关系配置错误:检查实体类中的@OneToMany@ManyToOne注解是否正确配置。
  3. 实体类定义错误:确保实体类被正确注解,并且数据库表结构与实体类映射一致。
  4. 事务管理:确保事务被正确管理,以避免数据不一致或查询失败。

如果你在uni-app中调用这个后端API时遇到问题,请检查网络请求、API路径、请求参数等是否正确。此外,确保后端服务正常运行并正确返回数据。希望这些信息能帮助你解决问题。

回到顶部