什么是Querydsl'Q'

时间:2013-05-21 04:19:26

标签: querydsl

我看到了一个Querydsl的例子,但我不明白QEmployee是什么

QEmployee employee = QEmployee.employee;
QEmployee e = new QEmployee("e");
query.from(employee)
    .where(employee.weeklyhours.gt(
        new HibernateSubQuery().from(employee.department.employees, e)
       .where(e.manager.eq(employee.manager))
       .unique(e.weeklyhours.avg())
)).list(employee)

有人请说明' Q '

3 个答案:

答案 0 :(得分:8)

“Q”类是基于您的实体自动生成的查询类型,用于在Querydsl中查询。

见这里(第2.1.5节):http://www.querydsl.com/static/querydsl/latest/reference/html/ch02.html#d0e184

答案 1 :(得分:4)

我看到已有答案,但我们认为应该扩大。 Querydsl自动生成表示数据库对象的类。如果你有一个像MyTable这样的表,相应的Querydsl对象默认会得到前缀“Q”(QMyTable)。要从该表进行查询,您只需要实例化QMyTable对象的实例,然后使用querydsl对该表进行操作(例如,mysqlquery.from(qmytableinstance).list(myfield))。

Q只是生成的Querydsl对象的默认名称前缀。在Querydsl对象生成期间,您可以使用setNamePrefix()方法告诉它使用您想要的任何命名前缀。以下是使用“NOTQ”而不是“Q”的JUnit测试中的示例:

@Test
public void testQueryDslGenerateCode_example() {
    Connection connection = this.getConnection();
    MetaDataExporter ex = new MetaDataExporter();
    ex.setPackageName(packageName);
    ex.setTargetFolder(new File(targetFolder));
    ex.setSchemaToPackage(true);
    ex.setSchemaPattern(schemaName);
    ex.setNamePrefix("NOTQ");
    try {
        ex.export(connection.getMetaData());
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

这个JUnit测试会生成所有以“NOTQ”而不是“Q”为前缀的类。希望这有用。

答案 2 :(得分:-3)

我认为Q只是参数或变量。也许您可以使用其他char,ehmmm或它的呼叫函数符号来更改它,名称为Q,然后跟随变量(Q+namevariable) 喜欢:

QCustomer customer = new QCustomer("c"); // alias for the CUSTOMER table