标签: hibernate-criteria

用Gorm查询列的子集

假设我有以下Domain类:

class Book {
  String title
  String author
  byte[] largeCoverArtImage
}
Run Code Online (Sandbox Code Playgroud)

我有一个列表视图,我不需要显示largeCoverArtImage,如何使用GORM Criteria执行以下SQL查询?

select title, author from Book
Run Code Online (Sandbox Code Playgroud)

grails hibernate grails-orm hibernate-criteria

7
推荐指数
2
解决办法
4989
查看次数

Hibernate标准api'选择'

是否可以使用hibernate critiria api创建"select in"查询?

示例:我在1:n关系,公司和部门中有两个表

select * from company c where c.id in (select company_id from department d 
where d.departmentname = 'HR' and d.location = 'xyz')
Run Code Online (Sandbox Code Playgroud)

hibernate subquery hibernate-criteria

7
推荐指数
1
解决办法
7254
查看次数

Hibernate Criteria Transformers.aliasToBean没有填充正确的值

我试图通过加入我的实体类来创建BO

Criteria criteria = session.createCriteria(Report.class,"r");
    criteria
    .createAlias("template", "t")
    .createAlias("constituents", "rc")
    .createAlias("rc.entity", "pe")
    .createAlias("pe.model", "m")
    .createAlias("pe.scenario", "s")
    .setProjection(Projections.projectionList()
            .add( Projections.property("r.Id"))        
            .add( Projections.property("t.Typ"))                
            .add( Projections.property("pe.bId"))               
            .add( Projections.property("m.model"))              
            .add( Projections.property("s.decay"))
      ).setMaxResults(100)
     .addOrder(Order.asc("r.Id"))
     .setResultTransformer(Transformers.aliasToBean(BO.class));
Run Code Online (Sandbox Code Playgroud)

我得到100个空BO,即所有属性都为null我的BO如下

public class BO implements Serializable {

private static final long serialVersionUID = 1L;
private int Id;
private String Typ;
private String bId;
private String model;
private String decay;

    Getters and Setters
Run Code Online (Sandbox Code Playgroud)

.....

当我删除行aliasToBean并迭代Object []时,我可以看到获取的正确值请指导我...

hibernate hibernate-criteria

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

Hibernate - 按公式属性排序标准

假设我有一个实体MyEntity,它有一个基于公式的属性fmlaProp.现在说我创建一个标准:

s.createCriteria(MyEntity.class) 
    .setProjection( 
        Projections.distinct( 
            Projections.property("fmlaProp"))) 
    .addOrder(Order.asc("fmlaProp"));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到以下SQL:

SELECT DISTINCT fmlaProp-sql FROM MY_ENTITY_TABLE ORDER BY fmlaProp-sql
Run Code Online (Sandbox Code Playgroud)

这给了Oracle一个错误,说明了order-by表达式是未选中的.然后我尝试了以下标准:

s.createCriteria(MyEntity.class) 
    .setProjection( 
        Projections.distinct(
            Projections.alias(
                Projections.property("fmlaProp"),
                "alias1")) 
    .addOrder(Order.asc("alias1"));
Run Code Online (Sandbox Code Playgroud)

哪个生成"按别名排序1",工作正常.但它有点难看 - 代码必须"知道"那些违反"一次写入"原则的公式属性.对此有何想法或建议?先感谢您.

oracle hibernate hibernate-criteria

7
推荐指数
1
解决办法
2164
查看次数

使用grails标准api定义OR条件

我有以下域对象:

class User {
    String name
    Transaction transaction

    static constraints = {
        transaction nullable: true
    }
}

class Transaction {        
    boolean successful
    User user        
    static belongsTo = User
}
Run Code Online (Sandbox Code Playgroud)

我想选择所有users没有成功交易的东西.这意味着我希望没有任何transaction(transaction == null)的用户和具有成功值false(transaction.successful == false)的事务的用户.我想使用Criteria API执行此操作(因为这可以与基于用户输入的其他条件结合使用).

我试过这个:

def c = User.createCriteria()
def results = c {
    or {
        isNull 'transaction'
        transaction {
            eq 'successful', false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这只给了我有交易的用户(成功的价值false).但我没有得到交易所在的用户null

以下代码显示了我如何创建一些示例数据:

def createUserAndTransaction(String name, Boolean successful = null) {
    User u …
Run Code Online (Sandbox Code Playgroud)

grails grails-orm hibernate-criteria

7
推荐指数
1
解决办法
8822
查看次数

如何使HIbernate获取根实体的所有属性并仅获取关联实体的特定属性?

我有root实体Hostel及其单一关联User owner.

当我获取Hostel实体时,我需要急切地获取User owner,但只有owner3个属性:userId,firstName,lastName.

现在我的标准查询是:

Criteria criteria = currenSession().createCriteria(Hostel.class);

criteria.add(Restrictions.ge("endDate", Calendar.getInstance()));
if (StringUtils.notNullAndEmpty(country)) {
        criteria.add(Restrictions.eq("country", country));
}

Long count = (Long) criteria
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
            .setProjection(Projections.rowCount()).uniqueResult();

criteria.setFetchMode("owner", FetchMode.SELECT);
criteria.addOrder(Order.desc("rating"));

// needed to reset previous rowCount projection
criteria.setProjection(null);

// retrieve owner association
criteria.createAlias("owner", "owner", JoinType.LEFT_OUTER_JOIN)
        .setProjection(
                Projections.projectionList()
                        .add(Projections.property("owner.userId"))
                        .add(Projections.property("owner.firstName"))
                        .add(Projections.property("owner.lastName")));

criteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
Run Code Online (Sandbox Code Playgroud)

接下来,我这样做criteria.list(),我得到sql语句,它只选择owner投影列表中指定的3个属性.但它不会选择root Hostel实体的任何属性.生成的查询是:

select
    owner1_.user_id as y0_,
    owner1_.firstName as y1_,
    owner1_.lastName as y2_ 
from
    HOSTEL this_ 
left outer …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-criteria

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

hibernate使用条件更新单列

我有一个包含mamy列的表,我想更新行的一列或几列而不影响我可以编写查询的剩余列:

update table as t set t.a=:a set t.b=:b where t.id=1
Run Code Online (Sandbox Code Playgroud)

但看到我不知道将选择哪些列进行更新,我认为为每个场景编写每个查询都不是一个好主意.好吧,我必须为每个场景编写查询,但我正在寻找一种更好的方法来动态更新表.我认为标准是一个不错的选择.但问题是我不知道如何编写标准更新特定列.我的代码现在可以更新列,但它会将其他列设置为null或为空.

在不更改其他列的情况下更新特定列的好方法是什么?

hibernate dml hibernate-criteria

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

使用Hibernate Criteria API,如何查询仅存在于某些属性类型的属性的子属性

考虑类Account,RealAccountVirtualAccount,以及Operation:

class Account { }
class RealAccount extends Account { String name; }
class VirtualAccount extends Account { }
class Operation { Account account; }
Run Code Online (Sandbox Code Playgroud)

这意味着:

  1. 只有RealAccount一个叫做的字段name.
  2. Operation的帐户可以是RealAccountVirtualAccount.

我想查询Operation属于RealAccount具有特定名称的所有s :

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

这失败了.

我的问题:使用"旧"的Hibernate API的标准,我怎么可以查询该账户名称只存在当Operation的帐户是RealAccount?也许是一些包容DetachedCriteriaSubqueries......

java hibernate subquery detachedcriteria hibernate-criteria

7
推荐指数
1
解决办法
324
查看次数

How can I control the SQL table aliases that Hibernate uses in its generated queries?

tl;dr: Hibernate automatically generates SQL table aliases in its queries like jurisdicti4_ or this_. Here's an example query:

SELECT
    this_.id                            AS id2_6_3_,
    this_.a_table_column                AS a_table_column3_6_3_,
    jurisdicti4_.b_table_column         AS b_table_column4_6_3_,
    
FROM
    app_table_a          this_
    LEFT OUTER JOIN jurisdiction       jurisdicti4_ ON this_.jurisdiction = jurisdicti4_.name
WHERE
    this_.a_table_column = ?
Run Code Online (Sandbox Code Playgroud)

I'm using the Hibernate Criteria API to add some hints that need reference the SQL aliases in the query, so I need to know how to either:

  1. specify the SQL table aliases Hibernate will use …

sql oracle hibernate hibernate-criteria

7
推荐指数
0
解决办法
412
查看次数

EmbeddedId的Hibernate标准

我有我的实体:

@Entity
@Table(name="performances")
@AssociationOverrides({
    @AssociationOverride(name="id.player", joinColumns=@JoinColumn(name="player_id")),
    @AssociationOverride(name="id.season", joinColumns=@JoinColumn(name="season_id"))
})
public class Performance extends AbstractEntity<PerformanceID> {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @Getter @Setter
    private PerformanceID id;
    @Getter @Setter
    private int goals;

    public Player getPlayer(){
        return id.getPlayer();
    }

    public Season getSeason(){
        return id.getSeason();
    }
Run Code Online (Sandbox Code Playgroud)

和:

@Embeddable
public class PerformanceID implements Serializable {

    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch=FetchType.LAZY, targetEntity=Player.class)
    @JoinColumn(name="player_id")
    @Getter @Setter
    private Player player;
    @ManyToOne(fetch=FetchType.LAZY, targetEntity=Season.class)
    @JoinColumn(name="season_id")
    @Getter @Setter
    private Season season;
Run Code Online (Sandbox Code Playgroud)

如何选择玩家名称为"Claudio"的演出记录?在HQL中,它只是工作:

Query query = …
Run Code Online (Sandbox Code Playgroud)

hibernate hibernate-criteria

6
推荐指数
1
解决办法
1370
查看次数