小编Mik*_*unu的帖子

QueryOver或子查询

我使用子查询获得以下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)

nhibernate queryover

23
推荐指数
1
解决办法
1万
查看次数

(懒惰)使用Hibernate Criteria API进行LEFT OUTER JOIN

我想使用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 '.

hibernate criteria outer-join

22
推荐指数
2
解决办法
4万
查看次数

Criteria中的setResultTransformer

标准API中setResultTransformer方法的用途是什么?有人可以用一个简单的例子来解释这个吗 我读了javadocs,但我无法清楚地理解它们.

问候,

hibernate criteria hibernate-criteria

21
推荐指数
2
解决办法
4万
查看次数

Hibernate条件查询不同对象的不同属性

假设我有以下课程:

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.

java hibernate criteria

16
推荐指数
1
解决办法
2万
查看次数

Hibernate Restrictions.in vs. Disjunction

除了更少的代码之外,使用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)

我问的原因是因为我在前者存在的情况下重构遗留代码,但我期待后者.如果它们都是相同的,我将单独保留遗留代码.

hibernate restrictions hibernate-criteria

15
推荐指数
2
解决办法
4万
查看次数

使用Hibernate Criteria和DISTINCT_ROOT_ENTITY进行分页

我已经使用以下代码实现了分页:

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时,我得到了正确的结果.

上面的代码有什么问题?

hibernate hibernate-criteria

15
推荐指数
3
解决办法
2万
查看次数

Criteria API返回的结果集太小

这怎么可能,我必须遵循标准

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奇怪的方面?


如果您正在寻找这个问题的答案,请务必阅读接受的答案及其评论.

java hibernate criteria hibernate-criteria

14
推荐指数
1
解决办法
5432
查看次数

Hibernate映射异常:无法确定列的类型:[org.hibernate.mapping.Column]

我想在两个表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)

hibernate jpa

12
推荐指数
1
解决办法
4万
查看次数

NHibernate - 使用Criteria API对整数列进行LIKE搜索的最简单方法?

我正在尝试对整数列进行搜索,我需要做的是实际将列转换为varchar然后执行类似搜索.这可能吗?使用Criteria API最简单的方法是什么?

var search = "123";
criteria.Add(Restrictions.Like("Number", "%" + search + "%"))
Run Code Online (Sandbox Code Playgroud)

nhibernate nhibernate-criteria

10
推荐指数
1
解决办法
6815
查看次数

Hibernate Criteria:Left Outer Join对两个表都有限制

我正在进行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 join criteria hibernate-criteria

9
推荐指数
1
解决办法
4万
查看次数