题
我在寻找一个生成器 非常 在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)));
更多的信息检查了 标准查询 从休眠文档
select stock
from com.something.Stock as stock, com.something.Bonus as bonus
where stock.bonus.id = bonus.id
这只是一个加入。休眠不自动的,如果并且只有如果你已经得到了之间的映射 Stock
和 Bonus
设置并且如果 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.java
- 测试: QueryBuilderMockTest
使用:
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);