我使用子查询获得以下NHibernate查询:
NHContext.Session.QueryOver<Item>()
.WithSubquery.WhereProperty(x => x.ItemId).In(QueryOver.Of<Foo>().Where(x => x.AFlag).Select(x => x.ItemId))
.WithSubquery.WhereProperty(x => x.ItemId).In(QueryOver.Of<Bar>().Where(x => x.AFlag).Select(x => x.Item))
.Future<Item>();
Run Code Online (Sandbox Code Playgroud)
这将运行以下SQL:
SELECT *
FROM item this_
WHERE this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Foo this_0_
WHERE this_0_.AFlag = 1 /* @p0 */)
and this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Bar this_0_
WHERE this_0_.AFlag = 1 /* @p0 */)
Run Code Online (Sandbox Code Playgroud)
我希望它使用OR,例如:
SELECT *
FROM item this_
WHERE this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Foo this_0_
WHERE this_0_.AFlag = 1 /* …Run Code Online (Sandbox Code Playgroud) 我想使用Criteria API在两个表之间执行LEFT OUTER JOIN.我在Hibernate文档中找到的就是这个方法:
Criteria criteria = this.crudService
.initializeCriteria(Applicant.class)
.setFetchMode("products", FetchMode.JOIN)
.createAlias("products", "product");
Run Code Online (Sandbox Code Playgroud)
但是,这会执行内部联接或右外部联接,因为它返回的结果数量.
我也希望我的加入是懒惰的.我怎样才能做到这一点?
干杯!
更新:似乎使用别名会自动连接INNER JOIN."背景故事"中还有一些我还没有掌握的东西.所以,今天没有别名.这给我留下了对两个表应用限制的问题,因为它们都有一个列(或属性,如果这更合适)' name '.
标准API中setResultTransformer方法的用途是什么?有人可以用一个简单的例子来解释这个吗 我读了javadocs,但我无法清楚地理解它们.
问候,
假设我有以下课程:
class A {
B getB();
C getC();
}
class B {
String getFoo();
}
class C {
int getBar();
}
Run Code Online (Sandbox Code Playgroud)
我想在A上过滤标准,在不同的子类属性上有两个过滤器,例如:
Criteria criteriaA = session.createCriteria(A.class);
Criteria criteriaB = criteriaA.createCriteria("b").add(Restrictions.eq("foo", "Something"));
Criteria criteriaC = criteriaA.createCriteria("c").add(Restrictions.eq("bar", 0));
Run Code Online (Sandbox Code Playgroud)
我想要做的是使用"或"子句组合criteriaB和criteriaC,如:
//this does not work
criteriaA.add(Restrictions.disjunction().add(criteriaB).add(criteriaC));
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?我在这里绊倒了一些API.
除了更少的代码之外,使用Hibernate Criteria API构建IN子句的以下两种方法之间的区别是什么?是否存在性能问题?我缺少的检索中是否有一些逻辑?就返回的行而言,它们似乎都执行相同的操作.
Disjunction disj = Restrictions.disjunction();
for (String value : stringArray) {
disj.add(Restrictions.eq("code", value));
}
where.add(disj);
Run Code Online (Sandbox Code Playgroud)
VS.
Restrictions.in("code", stringArray);
Run Code Online (Sandbox Code Playgroud)
我问的原因是因为我在前者存在的情况下重构遗留代码,但我期待后者.如果它们都是相同的,我将单独保留遗留代码.
我已经使用以下代码实现了分页:
public Paginacao<Anuncio> consultarPaginado(int pagina, Integer cidadeId) {
Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria(Anuncio.class);
criteria.add(Restrictions.eq("ativo", true));
criteria.add(Restrictions.eq("statusLiberacao", AnunciosUtil.STATUS_ANUNCIO_LIBERADO));
criteria.add(Restrictions.eq("statusVendaAnuncio", AnunciosUtil.STATUS_VENDA_ANUNCIO_DISPONIVEL));
if (cidadeId != null) {
criteria.add(Restrictions.eq("cidade.id", cidadeId));
}
criteria.addOrder(Order.desc("dataPostagem"));
criteria.setProjection(Projections.rowCount());
Long count = (Long) criteria.uniqueResult();
Paginacao<Anuncio> paginacao = new Paginacao<Anuncio>();
int qtdPaginas = (count.intValue() / 7) + 1;
paginacao.setQtdPaginas(qtdPaginas);
criteria.setProjection(null);// reseta a criteria sem a projeção
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
if (pagina > qtdPaginas) {
pagina = qtdPaginas;
}
pagina = pagina - 1;
criteria.setFirstResult(pagina * ConstantesGenericas.MAXIMO_OBJETOS_RETORNADOS);
criteria.setMaxResults(ConstantesGenericas.MAXIMO_OBJETOS_RETORNADOS);
paginacao.setRegistros(criteria.list());
return paginacao;
}
Run Code Online (Sandbox Code Playgroud)
当我手动构建SQL查询并将其提交到数据库时,我得到8个结果.但是,当我尝试上面的代码时,在将ResultTransformer设置为DISTINCT_ROOT_ENTITY之前,获得8个结果(没有区别),并在设置之后得到4个结果.但是我应该得到8个结果(使用DISTINCT),因为当我手动构建SQL而没有不同时,我得到11个结果,当我使用DISTINCT时,我得到了正确的结果.
上面的代码有什么问题?
这怎么可能,我必须遵循标准
Criteria criteria = getSession().createCriteria(c);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.add(Restrictions.eq("active",true));
List list = criteria.list();
列表的大小现在是20.如果我在条件中添加最大结果,
Criteria criteria = getSession().createCriteria(c);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setMaxResults(90);
criteria.add(Restrictions.eq("active",true));
List list = criteria.list();Run Code Online (Sandbox Code Playgroud)
..现在列表的大小是18!
在定义最大结果后,我不明白结果集大小如何更小,因为行数小于定义的最大值.这肯定看起来像一个bug,或者还有一些我不知道的hibernate奇怪的方面?
如果您正在寻找这个问题的答案,请务必阅读接受的答案及其评论.
我想在两个表BookStock和Book之间进行一对多的映射,但是我得到以下异常
Exception in thread "main" org.hibernate.MappingException: Could not determine type for: java.util.List, at table: book_stock, for columns: [org.hibernate.mapping.Column(books)]
Run Code Online (Sandbox Code Playgroud)
bookStock实体是
@Entity
@Table(name = "book_stock")
public class BookStock {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long stock;
private List<Book> books;
@Column(name = "id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "stock")
public Long getStock() {
return stock;
}
public void setStock(Long stock) {
this.stock = stock;
}
@OneToMany
@PrimaryKeyJoinColumn …Run Code Online (Sandbox Code Playgroud) 我正在尝试对整数列进行搜索,我需要做的是实际将列转换为varchar然后执行类似搜索.这可能吗?使用Criteria API最简单的方法是什么?
var search = "123";
criteria.Add(Restrictions.Like("Number", "%" + search + "%"))
Run Code Online (Sandbox Code Playgroud) 我正在进行LEFT OUTER JOIN,但我只能在第一个表上应用Restrictions.有没有办法在第二张桌子上申请?
这是我的代码:
Criteria criteria = this.crudService
.initializeCriteria(Applicant.class).setFetchMode("products",
FetchMode.JOIN);.
Run Code Online (Sandbox Code Playgroud)
这工作(申请人有applicantName属性):
criteria.add(Restrictions.eq("applicantName", "Markos")
Run Code Online (Sandbox Code Playgroud)
这些都不起作用(产品具有productName属性)
criteria.add(Restrictions.eq("productName", "product1")
Run Code Online (Sandbox Code Playgroud)
criteria.add(Restrictions.eq("products.productName","product1")// products:属性的名称criteria.add(Restrictions.eq("Product.productName","product1")//产品:数据库表的名称
这是我收到的例外(如果我理解正确),申请人中不存在productName属性:
EJB Exception: ; nested exception is: org.hibernate.QueryException: could not resolve property: products.inventedName of: org.myCompany.applicant.entity.Applicant; nested exception is: org.hibernate.QueryException: could not resolve property: products.inventedName of: org.myCompany.applicant.entity.Applicant
Run Code Online (Sandbox Code Playgroud)
我尝试使用别名,但这会生成一个INNER JOIN,而不是我想要的LEFT OUTER JOIN.
如何对两个表格施加限制?
更新:
问题可能与此相同:https: //forum.hibernate.org/viewtopic.php?p = 2393694
hibernate ×8
criteria ×5
java ×2
nhibernate ×2
join ×1
jpa ×1
outer-join ×1
queryover ×1
restrictions ×1