Querydsl嵌套查询生成错误sql

时间:2018-07-27 02:51:05

标签: sql syntax-error querydsl

我写了一个简单的嵌套查询

@Autowired
@PersistenceContext
EntityManager entityManager;
@Autowired
Configuration configuration;
private JPASQLQuery<?> queryFactory;

@PostConstruct
public void init() {
    queryFactory = new JPASQLQuery<>(entityManager, configuration);
}

public void student() {

    QStudent student = new QStudent("student");
    QStudent nested = new QStudent("nested");

    List<?> fetch = queryFactory.select(student.id)
            .from(SQLExpressions.select(nested.id)
                    .from(nested), student)
            .fetch();

}

实体结构是这样的

@Entity
@Table(name = "u_student")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

生成的sql就是这样

  

选择student.id   从u_student(选择nested.id   来自u_student嵌套)作为学生

外部sql添加了一个tableName,导致sql语法错误

我错了吗?这样的嵌套查询应如何编写?

第一次发送问题不是很有用,谢谢。

1 个答案:

答案 0 :(得分:0)

发现使用PathBuilder可以解决此问题

完整的代码是:

    PathBuilder<Tuple> studentAlias = new PathBuilder<>(Tuple.class,"student");
    QStudent student = new QStudent("student");
    QStudent nested = new QStudent("nested");

    List<?> fetch = queryFactory.select(student)
            .from(SQLExpressions.select(nested.id)
                    .from(nested), studentAlias)
            .fetch();

生成的sql:

select student.id as id1_90_0_
from (select nested.id from u_student nested) as student

您有更好的计划吗?