标签: hibernate-criteria

带有投影的休眠条件不执行 @OneToMany 映射查询

我有一个域对象 Expense,它有一个名为initialFields的字段。

它是这样注释的:

@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试使用 Projections 以便出于性能原因仅提取某些字段,但是这样做时 initialFields 字段始终为空。它是唯一的 OneToMany 字段,也是我试图用这种方式的投影检索的唯一字段。如果我使用常规 HQL 查询,initialFields 会适当填充,但当然我不能限制字段。

部分投影代码:

Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e");

ProjectionList properties = Projections.projectionList();
//Some restrictions and more fields
properties.add(Projections.property("e.initialFields"), "initialFields");
criteria.setProjection(properties);
criteria.setFetchMode("e.initialFields", FetchMode.JOIN);
criteria.setReadOnly(true);
criteria.setResultTransformer(Transformers.aliasToBean(Expense.class));

return criteria.list();
Run Code Online (Sandbox Code Playgroud)

当我打开调试并打开 show sql 时,似乎没有创建/运行拉取 initialFields 的查询。有没有人见过这样的事情?

我刚刚尝试使用 HQL 投影,通过指定我想要拉取的每个字段然后手动构建对象。在这种情况下,Hibernate 构建的 SQL 对于 initialFields 字段是不正确的。 expense1_.name as col_1_0_, . as col_2_0_, expense1_.account_id as col_3_0_ …

java hibernate projection hibernate-criteria

5
推荐指数
1
解决办法
6031
查看次数

如何解决"无法解析路径属性[organizationType.id]"异常?

我使用的是Spring 3.1.1.RELEASE,Hibernate 4.1.0.Final,JUnit 4.8和JPA 2.0(hibernate-jpa-2.0-api).我正在尝试根据成员字段的字段编写查询和搜索.我的意思是我有这个实体......

@GenericGenerator(name = "uuid-strategy", strategy = "uuid.hex")
@Entity
@Table(name = "cb_organization", uniqueConstraints = {@UniqueConstraint(columnNames={"organization_id"})})
public class Organization implements Serializable
{

    @Id
    @NotNull
    @GeneratedValue(generator = "uuid-strategy")
    @Column(name = "id")
    /* the database id of the Organization */
    private String id;

    @ManyToOne 
    @JoinColumn(name = "state_id", nullable = true, updatable = false)
    /* the State for the organization */
    private State state;

    @ManyToOne
    @JoinColumn(name = "country_id", nullable = false, updatable = false)
    /* The country the Organization is in …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa entitymanager hibernate-criteria

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

查询@ElementCollection JPA

我有一个Entity Transaction如下:

@Entity
class Transaction extends AbstractEntity<Long>{
        private static final long serialVersionUID = 7222139865127600245L;
        //other attributes

    @ElementCollection(fetch = FetchType.EAGER, targetClass = java.lang.String.class)
    @CollectionTable(name = "transaction_properties", joinColumns = @JoinColumn(name = "p_id"))
    @MapKeyColumn(name = "propertyKey")
    @Column(name = "propertyValue")
    private Map<String, String> properties;

    //getters and setters
}
Run Code Online (Sandbox Code Playgroud)

所以,我的数据库Tabletransaction_properties

mysql> desc transaction_properties;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| p_id          | bigint(20)   | NO   | PRI |         |       | …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa hibernate-criteria

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

具有 Oracle 分析窗口功能的 Hibernate Criteria

试图覆盖 Oracle10gDialect 并添加 over 和 partition 函数。我在hibernate.org 上阅读了有关如何覆盖方言的信息。我正在使用 Hibernate 4.1.7.Final 并且无法升级。我按照规定实现了它,但是我收到了这个错误。

     15:21:21,353  WARN SqlExceptionHelper:143 - SQL Error: 907, SQLState: 42000
[10/8/13 15:21:21:354 CDT] 00000021 SystemOut     O ORA-00907: missing right parenthesis

[10/8/13 15:21:21:354 CDT] 00000021 SystemOut     O 15:21:21,354 ERROR SqlExceptionHelper:144 - ORA-00907: missing right parenthesis
Run Code Online (Sandbox Code Playgroud)

这是我构建的类:

package com.edmann.util;

import org.apache.log4j.Logger;
import org.hibernate.dialect.Oracle10gDialect;
import org.hibernate.dialect.function.StandardSQLFunction;

/**
 * Because i need some analytic functions i am going to extend the
 * oracle10gDialect so i can register my functions i want to …
Run Code Online (Sandbox Code Playgroud)

java hibernate analytic-functions oracle10g hibernate-criteria

5
推荐指数
1
解决办法
3656
查看次数

如何防止 Hibernate 中的重复结果?

尝试搜索关系的多个值时,会返回重复的结果。

我怎样才能避免这些重复?

我们的服务有一个方法来构建Criteria

@Override
protected Criteria createCriteria(Map<String, Object> values) {
    Criteria criteria = super.createCriteria(values);
    if (criteria != null && values != null) {

        // other criteria restrictions

        Set<MDTErkenning> erkenningen = (Set<MDTErkenning>) values.get("erkenningen");
        if (erkenningen != null && !erkenningen.isEmpty()) {
            criteria.createAlias("erkenningen", "erkenningen");
            criteria.add(Restrictions.in("erkenningen." + CollectionPropertyNames.COLLECTION_ELEMENTS, erkenningen));
        }

    }
    return criteria;
}
Run Code Online (Sandbox Code Playgroud)

用于获取分页结果并进行计数:

@Override
public List<T> findByCriteria(Map<String, Object> values, int offset, int amount) {
    Criteria criteria = createCriteria(values)
            .setFirstResult(offset)
            .setMaxResults(amount);
    return criteria.list();
}

@Override
public Long getCount(Map<String, Object> values) { …
Run Code Online (Sandbox Code Playgroud)

java hibernate criteria hibernate-criteria

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

Hibernate Criteria查询多个类(或通过子类列表限制)

假设我有一些类,如下所示:

OpA extends Operation
OpA1 extends OpA
OpA2 extends OpA
OpB extends Operation
OpB1 extends OpB
OpB2 extends OpB
OpB3 extends OpB
OpC extends Operation

                        Operation
                            |
            /-----------------------------\
           /                |              \
         OpA               OpB             OpC
         /                  |
        /                   |
   /------\           /-----------\
  /        \         /      |      \
 OpA1     OpA2     OpB1    OpB2    OpB3
Run Code Online (Sandbox Code Playgroud)

如果我想找一些操作,我可以这样做:

session.createCriteria(Operation.class)
       .add(...)
       .add(...)
       .addOrder(...)
       .setFirstResult(...)
       .setMaxResults(...)
       .list();
Run Code Online (Sandbox Code Playgroud)

但是,如果我想将这些标准不应用于所有类型的操作Operation.class,而只应用于类型的那些操作:OpA2+ OpB1+ OpB3+ OpC

我的问题:我怎样才能使用Hibernate Criteria?请不要HQL.

注意:我不知道是否应该将此问题视为"查询多个类"(其中所有字段都具有与我查询的字段相同的字段),或者我将其视为"限制查询"通过子类列表".

编辑:如果我能创建一个接口TheOnesIWant,然后进行类OpA2,OpB1, …

java hibernate hibernate-criteria

5
推荐指数
1
解决办法
1860
查看次数

仅存在于子类中的属性的别名(Hibernate Criteria)

考虑该类Operation及其3个子类:

 class Operation {}
 class OpA extends Operation { }
 class OpB extends Operation { Account account; }
 class OpC extends Operation { Account account; }
Run Code Online (Sandbox Code Playgroud)

只有OpBOpC有一个字段叫account.

我想查询account属性:

session.createCriteria(Operation.class)
       .add(Restrictions.eq("account", account))
       .list();
Run Code Online (Sandbox Code Playgroud)

这有效.休眠忽略了一个事实,这两个OperationOpA没有所谓的领域account,并返回正确的结果OpBOpC.

但是,现在我还想查询帐户所有者,并按顺序排序.然后,我创建别名_accountaccount:

session.createCriteria(Operation.class)
       .add(Restrictions.eq("account", account))
       .createAlias("account", "_account")
       .add(Restrictions.eq("_account.owner", "John"))
       .addOrder(Order.asc("_account.owner"))
       .list();
Run Code Online (Sandbox Code Playgroud)

这失败了.该帐户有两个单独的表(来自OpBOpC),所以Hibernate抱怨:

Not unique table/alias: 'account1_'
Run Code Online (Sandbox Code Playgroud)

我的问题:如何Criteria …

java hibernate subquery detachedcriteria hibernate-criteria

5
推荐指数
1
解决办法
2830
查看次数

在JPA 2.1中使用实体图时,有没有一种方法可以在有子图的子图时使用元模型?

例如,假设Customer实体具有一组订单.每个订单都有一组OrderItems.

我可以使用命名属性执行此操作:

EntityGraph<Customer> eg = em.createEntityGraph(Customer.class);
Subgraph<Order> egChild = eg.addSubgraph("orders");
egChild.addAttributeNodes("orderItems");
Run Code Online (Sandbox Code Playgroud)

如果我只对Orders感兴趣,我可以使用元模型执行此操作:

EntityGraph<Customer> eg = em.createEntityGraph(Customer.class);
eg.addSubgraph(Customer_.orders);
Run Code Online (Sandbox Code Playgroud)

但是,如果我只想使用元模型的整个图形,我不能这样做:

EntityGraph<Customer> eg = em.createEntityGraph(Customer.class);
Subgraph<Set<Order>> egChild = eg.addSubgraph(Customer_.orders);
egChild.addAttributeNodes(Order_.orderItems);
Run Code Online (Sandbox Code Playgroud)

问题似乎是这样的

eg.addSubgraph(Customer_.orders)
Run Code Online (Sandbox Code Playgroud)

返回一个

Subgraph<Set<Order>> 
Run Code Online (Sandbox Code Playgroud)

而不是一个

Subgraph<Order>
Run Code Online (Sandbox Code Playgroud)

这是元模型/实体图的缺点,还是我遗漏了什么?

hibernate jpa hibernate-criteria

5
推荐指数
1
解决办法
487
查看次数

我们可以检查休眠条件别名已经存在吗?

几分钟前收到错误“重复别名”,我开始思考“我们可以检查别名是否已经创建?别名已经存在。”

你知道吗?我们可以检查一下吗?

例如 :

Criteria criteria = getSeession().createCriteria(Example.class,"example");
criteria.createAlias("example.test","test");
Run Code Online (Sandbox Code Playgroud)

现在我想要这个,我会检查这个“测试”别名是否已经创建,我不会创建,我不会创建。

那可能吗?如果那可能怎么办?如果不可能,你能提供任何其他解决方案吗?

java hibernate hibernate-criteria

5
推荐指数
1
解决办法
1884
查看次数

Hibernate 5更改不使用仅获取第一行

我正在使用带有oracle 11的Hibernate 5.2,它不支持仅获取第一行,我需要回到旧式的hibernate.是否有任何hibernate配置来做到这一点?

hibernate oracle11g hibernate-criteria

5
推荐指数
1
解决办法
785
查看次数