我在寻找一个生成器 非常 在Java。我想要摆脱的一样东西:

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 适合我需要现在,但我很想找到一个有更多的用户和测试比我的孤独。

注:我想可能做这样的事情越多,这是我未能做到与该标准API:

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

ie。选择的所有股票的财产 someValue 点到 任何 奖金的奖金表。

谢谢!

有帮助吗?

解决方案

@塞巴斯蒂安*罗卡Serra
现在我们取得了一些混凝土。这种加入你们试图要做的是不是真的能够通过标准API,但一个子查询应完成同样的事情。首先,你创建的一个 DetachedCriteria 奖金表,然后使用 IN 操作员用的 someValue.

DetachedCriteria bonuses = DetachedCriteria.forClass(Bonus.class);
List stocks = session.createCriteria(Stock.class)
    .add(Property.forName("someValue").in(bonuses)).list();

这相当于

select stock
from com.something.Stock as stock
where stock.someValue in (select bonus.id from com.something.Bonus as bonus)

唯一的缺点是,如果你有提到在不同的桌子 someValue 和你的身份证的不是唯一的所有表格。但是你的查询将遭受同样的缺陷。

其他提示

不会的 标准API 为你做它?它看起来几乎就像是你要求的。

对于一个类安全的方法问题,考虑 Querydsl.

例查询变得

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

Querydsl使用易代码生成像JPA2并支持访问用户/休眠,被创建、SQL和爪哇的集合。

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

对于另一类型的安全的查询dsl,我建议 http://www.torpedoquery.org.图书馆仍然是年轻的,但它提供了种类型的安全通过直接使用你的实体的课程。这意味着早日编译错误查询时,不再适用之前,重构或重新设计。

我还向您提供了一个例子。我觉得从你的员额,你在哪里,想做一个子查询限制,因此我根据exemple在于:

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<Stock> stocks = select(stock).list(entityManager);

它看起来像你想使用的标准查询API建进入休眠状态。做你的上查询这会是这样的:

List<Stock> stocks = session.createCriteria(Stock.class)
    .add(Property.forName("id").eq(id))
    .list();

如果你没有进入休眠届会议,你可以使用'DetachedCriteria像这样:

DetachedCriteria criteria = DetachedCriteria.forClass(Stock.class) 
    .add(Property.forName("id").eq(id));

如果你想得到所有的股票有一个奖励与特定ID你可以做到以下几点:

DetachedCriteria criteria = DetachedCriteria.forClass(Stock.class)
     .createCriteria("Stock")
          .add(Property.forName("id").eq(id)));

更多的信息检查了 标准查询 从休眠文档

@塞巴斯蒂安*罗卡Serra

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

这只是一个加入。休眠不自动的,如果并且只有如果你已经得到了之间的映射 StockBonus 设置并且如果 bonus 是一个酒店的 Stock. Criteria.list() 将返回 Stock 对象你刚才叫 stock.getBonus().

注意,如果你想要做什么喜欢

select stock
from com.something.Stock as stock
where stock.bonus.value > 1000000

你需要用到的 Criteria.createAlias().它会喜欢的东西

session.createCriteria(Stock.class).createAlias("bonus", "b")
   .add(Restrictions.gt("b.value", 1000000)).list()

标准API不提供所有功能缴费在非常.例如,你不能多于一个加入了同一列。

为什么你不用 命名查询?这看起来更加清洁:

Person person = session.getNamedQuery("Person.findByName")
                             .setString(0, "Marcio")
                             .list();

我写了一GPL会解决方案好的坐落,你可以容易地建立适合于你的情况。

使用:

QueryBuilder qb = new QueryBuilder();
qb.select("img");
qb.from("Image", "img");
qb.join("img.pixels", "pix", true, false);

// Can't join anymore after this
qb.where(); // First
qb.append("(");
qb.and("pt.details.creationTime > :time");
qb.param("time", new Date());
qb.append(")");
qb.and("img.id in (:ids)");
qb.paramList("ids", new HashSet());
qb.order("img.id", true);
qb.order("this.details.creationEvent.time", false);

它的职能作为一个国家机"选择->从->的加入->在哪里->秩序",等等。并保持了可选择的参数。有几个查询的标准API不能执行(见 HHH-879),以便在结束这简单来写这个小类包装StringBuilder.(注:还有一票 HHH-2407 描述一种休眠分支,它应该统一两个。在这之后,它可能会使意义的重新参观的标准API)

看看搜索软件包可以从 休眠一般性道 的项目。这是一个相当不错非常建设者的执行。

我知道这线是很老,但我也是在寻找一个HqlBuilder和我发现了这个 "屏幕保护程序"项目
它不是一个Windows屏幕保护程序,它是一个 "实验室信息管理系统(-里姆斯)高通量筛选(特)的设施,执行小分子和RNAi屏幕。"

它包含一个HQLBuilder是看上去很好。
这里是一个样本列表中的可用方法:

...
HqlBuilder select(String alias);
HqlBuilder select(String alias, String property);
HqlBuilder from(Class<?> entityClass, String alias);
HqlBuilder fromFetch(String joinAlias, String joinRelationship, String alias);
HqlBuilder where(String alias, String property, Operator operator, Object value);
HqlBuilder where(String alias, Operator operator, Object value);
HqlBuilder where(String alias1, Operator operator, String alias2);
HqlBuilder whereIn(String alias, String property, Set<?> values);
HqlBuilder whereIn(String alias, Set<?> values);
HqlBuilder where(Clause clause);
HqlBuilder orderBy(String alias, String property);
HqlBuilder orderBy(String alias, SortDirection sortDirection);
HqlBuilder orderBy(String alias, String property, SortDirection sortDirection);
String toHql();
...

现在也可提供标准的 访问用户类型的安全 查询和较少的标准,但还好 查询对象

实例:

访问用户类型的安全

EntityManager em = ...
CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery<Stock> c = qb.createQuery(Stock.class);
Root<Stock> = c.from(Stock.class);
Predicate condition = qb.eq(p.get(Stock_.id), id);
c.where(condition);
TypedQuery<Stock> q = em.createQuery(c); 
List<Stock> result = q.getResultList();

查询对象

EntityManager em = ...
ObjectQuery<Stock> query = new GenericObjectQuery<Stock>(Stock.class);
Stock toSearch = query.target();
query.eq(toSearch.getId(),id);
List<Stock> res = (List<Stock>)JPAObjectQuery.execute(query, em);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top