当前位置:  开发笔记 > 编程语言 > 正文

寻找HQL构建器(Hibernate查询语言)

如何解决《寻找HQL构建器(Hibernate查询语言)》经验,为你挑选了3个好方法。

我正在寻找Java中的HQL构建器.我想摆脱像这样的事情:

StringBuilder builder = new StringBuilder()
    .append("select stock from ")
    .append( Stock.class.getName() )
    .append( " as stock where stock.id = ")
    .append( id );

我宁愿有类似的东西:

HqlBuilder builder = new HqlBuilder()
    .select( "stock" )
    .from( Stock.class.getName() ).as( "stock" )
    .where( "stock.id" ).equals( id );

我google了一下,我找不到一个.

我写了一个快速和愚蠢的东西HqlBuilder,适合我现在的需求,但我很想找到一个比我更多的用户和测试.

注意:我希望能够做到这样的事情以及更多,我没有使用Criteria API:

select stock
from com.something.Stock as stock, com.something.Bonus as bonus
where stock.someValue = bonus.id

即.从Bonus表中选择所有属性someValue指向任何奖金的股票.

谢谢!



1> Timo Westkäm..:

对于您的问题的类型安全方法,请考虑Querydsl.

示例查询变为

HQLQuery query = new HibernateQuery(session);
List s = query.from(stock, bonus)
  .where(stock.someValue.eq(bonus.id))
  .list(stock);

Querydsl使用APT代码生成,如JPA2,并支持JPA/Hibernate,JDO,SQL和Java集合.

我是Querydsl的维护者,所以这个答案是有偏见的.



2> sblundy..:

未在标准API为你做?它看起来几乎就像你要求的那样.



3> ebelanger..:

对于另一个类型安全的查询dsl,我推荐http://www.torpedoquery.org.该库仍然很年轻,但它通过直接使用您的实体类提供类型安全.这意味着在重构或重新设计之前查询不再适用时,早期的编译器错误.

我还为你提供了一个例子.我想从你的帖子中你试图做一个子查询限制,所以我根据这个例子:

import static org.torpedoquery.jpa.Torpedo.*;

Bonus bonus = from(Bonus.class);
Query subQuery = select(bonus.getId());

Stock stock = from(Stock.class);
where(stock.getSomeValue()).in(subQuery);

List stocks = select(stock).list(entityManager);

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有