标签: criteria-api

JPA CriteriaBuilder 和子字符串

我有一个 CriteriaBuilder,我试图在其中获取从 0 到 10 的字符。但是我无法获得所需的输出。

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Emp> cq = cb.createQuery(Emp.class);
    Root<Emp> c = cq.from(Emp.class);
    cb.substring(c.<String>get("projDesc"), 0, 10);
    cq.orderBy(cb.desc(c.get("salary")));
    Query query = em.createQuery(cq);
    .....
Run Code Online (Sandbox Code Playgroud)

这可能是什么原因?

java jpa eclipselink criteria-api jpa-2.0

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

JPA 标准谓词条件

我有以下代码片段用于构建条件生成器的条件。

想知道是否有任何方法可以使其更好,因为我将有更多的条件和相同的条件将用于获取记录计数。

任何见解都是非常值得赞赏的

private List <Product> getProducts(MultivaluedMap params) throws JSONException {

    CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
    CriteriaQuery <Product> criteriaQuery = criteriaBuilder.createQuery(Product.class);

    Root <Product> root = criteriaQuery.from(Product.class);

    List <Predicate> p = new ArrayList <Predicate> ();
    Predicate prodIdPredicate, prodNamePredicate;

    JSONObject inputJSON = new JSONObject(params);

    if (inputJSON.isNull("filter") == false) {
        JSONObject filter = inputJSON.getJSONObject("filter");
        JSONArray filters = filter.getJSONArray("filters");
        for (int i = 0; i < filters.length(); i++) {

            JSONObject j = (JSONObject) filters.get(i);
            if (j.getString("field").equals("prodId")) {
                prodIdPredicate = criteriaBuilder.like(root.get(Product_.prodId), j.getString("value"));
                p.add(prodIdPredicate);
            }

            if (j.getString("field").equals("prodName")) …
Run Code Online (Sandbox Code Playgroud)

java json jpa criteria-api jpa-2.0

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

Hibernate Criteria API 加入没有任何关联的实体

我正在尝试编写一个相当于以下 SQL 查询的 Hibernate Criteria API:

select c.NAME         as carName,
   cc.COLOR_CODE      as colorCode,
   cc.COLOR           as color,
   c.DESCRIPTION      as desc,
   c.MANUFACTURE_YEAR as year
from CAR c
     LEFT JOIN CAR_COLOR CC on c.COLOR_CODE_ID = CC.ID
WHERE CC.COLOR_CODE = ?
Run Code Online (Sandbox Code Playgroud)

这是我的Car实体

public class Car extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @Basic
    @Column(name = "MANUFACTURE_YEAR")
    private String year;

    @Basic
    @Column(name = "DESCRIPTION")
    private String desc;
    private Long colorCodeId;
    private String manufacturer;
}
Run Code Online (Sandbox Code Playgroud)

这是我的CarColor实体 …

hibernate jpa criteria criteria-api hibernate-criteria

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

jpa 标准 api 中 PostgreSQL 函数“jsonb_path_exists”的用法

我想使用 JPA 标准 api 调用 postgresql 函数jsonb_path_existshttps://www.postgresql.org/docs/12/functions-json.html)。

假设我有以下查询:

select id from person where jsonb_path_exists(person.json,'$.some_property[0].typ ? (@ =="Something")');
Run Code Online (Sandbox Code Playgroud)

通过 CriteriaBuilder 我会做类似的事情:

        var jsonQuery = jsonPath + " ? (@ ==\"" + value + "\")"; // evaluates to '$.some_property[0].typ ? (@ =="Something")'
        criteriaBuilder.function("jsonb_path_exists",
                        String.class,
                        entityRoot.get("json"),
                        criteriaBuilder.literal(jsonQuery)
                )
                .in(Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)

但是我还没有弄清楚如何将作为字符串提供的 jsonQuery 转换为 postgresjsonpath类型。因此我收到以下异常:

org.postgresql.util.PSQLException: ERROR: function jsonb_path_exists(jsonb, character varying) does not exist
Run Code Online (Sandbox Code Playgroud)

正确的签名是 jsonb_path_exists(target jsonb, path jsonpath [, vars jsonb [, silent bool]])

所有带有jsonpath参数的函数都存在此问题,例如jsonb_path_query …

postgresql jpa criteria-api

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

使用NHibernate Criteria API创建嵌套的OR语句

所以我喜欢学习关于NHibernate的新东西,因为它真的非常灵活,让我的生活很轻松,除了我现在被困在哪里;).到目前为止,我没有必要进行非常复杂的查询,而且这个查询也不复杂,但我觉得最常用的方法和对象类型不会涵盖这个问题.

这是我想要查询的内容:

SELECT _Table1.UserID, _Table1.ColorID, _Table1.AppID FROM _Table1
INNER JOIN _Table2 ON _Table2.AppID = _Table1.AppID 
WHERE _Table1.ColorID= @param0
AND (
      _Table2.WindowID = @param1 OR
      _Table2.WindowID = @param2 OR
      _Table2.WindowID = @param3 OR
      ................ = @param(N - 1)
    ) 
Run Code Online (Sandbox Code Playgroud)

这是我使用标准API的原因

private IList<Table1Entity> FetchListByWindowId(int colorID, List<int> listOfWindowIDs)
{

    var list = CurrentSession.CreateCriteria<Table1Entity>()
                 .Add(Restrictions.Eq("ColorID", colorID))
                 .CreateCriteria("Table2EntityList");

    foreach (var item in listOfWindowIDs)
    {
        list.GetCriteriaByPath("Table2EntityList")
            .Add(Restrictions.Eq("WindowID", Int32.Parse(item)
    }
}
Run Code Online (Sandbox Code Playgroud)

表1的映射包括4个属性UserID,ColorID,AppID和HasMany到Table2实体.

HasMany<Table2Entity>(x => x.Table2EntityList)
     .KeyColumns.Add("AppID")
     .Not.LazyLoad()
     .Inverse()
     .Cascade.None();
Run Code Online (Sandbox Code Playgroud)

从我寻找解决方案的一整天开始,我认为没有一种简单的方法可以明确地说"使这些表达式成为OR"(是的,我已经看过Expression.OR,这不是我想要的).

NHibernate给我的查询正是我想要的,除了我需要用"OR"替换一些"AND"

谢谢,对不起,如果事实证明这是非常微不足道的.我也想为我的代码的模糊性道歉,但我处理敏感数据.因此必须调整所有变量名称和方法名称等.

编辑:NHibernate目前给我的查询:

SELECT _Table1.UserID, _Table1.ColorID, _Table1.AppID …
Run Code Online (Sandbox Code Playgroud)

c# nhibernate nested sql-server-2008 criteria-api

0
推荐指数
1
解决办法
884
查看次数

使用JPA2在TypedQuery上设置超时

我想在javax.persistence.TypedQuery上设置超时.

我发现这个简单的方法:

TypedQuery<Foo> query = ... ;
query.setHint("javax.persistence.query.timeout", 1000);
query.getReturnList();
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用,它只是被忽略了.

PRO JPA 2书中:

"不幸的是,设置查询超时不是可移植行为.它可能不受所有数据库平台支持,也不是所有持久性提供程序都支持的要求.因此,必须为三种情况准备要启用查询超时的应用程序.

首先是该属性被默默地忽略并且没有效果.

第二个是启用该属性,并且中止任何超过指定超时值的选择,更新或删除操作,并抛出QueryTimeoutException.可以处理此异常,并且不会导致任何活动事务被标记为回滚.

第三种情况是该属性已启用,但在执行此操作时,数据库会在超出超时时强制执行事务回滚.在这种情况下,将抛出PersistenceException并将事务标记为回滚.通常,如果启用,则应编写应用程序以处理QueryTimeoutException,但如果超出超时并且不抛出异常,则不应该失败."

有没有人知道在TypedQuery上指定超时的任何其他方法?

或者我怎样才能使这个"提示"起作用?

谢谢

编辑:Oracle 11.2.0.4.0和PostgreSql 9.2.9与JPA 2.1/Hibernate

java jpa java-ee criteria-api jpa-2.1

0
推荐指数
1
解决办法
4233
查看次数

无法在此 ManagedType 上找到具有给定名称的属性 [未知]

我有一个名为

public class Customer implements Auditable {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "SellerID")
private Long id;

@Embedded
private AuditSection auditSection = new AuditSection();
......
......
}

@Embeddable
public class AuditSection implements Serializable {
private static final long serialVersionUID = -1934446958975060889L;
@Temporal(TemporalType.TIMESTAMP)
  @Column(name = "DateCreated")
  private Date dateCreated;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "DateModified")
  private Date dateModified;
  ......
  }
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 criteriaBuilder 和谓词进行搜索

 predicates.add(criteriaBuilder.and(criteriaBuilder.notEqual(root.get("modifiedDate"), new Date)));
Run Code Online (Sandbox Code Playgroud)

在这里我得到了异常

org.springframework.dao.InvalidDataAccessApiUsageException: Unable to locate Attribute  with the the given name [modifiedDate] on this ManagedType [unknown]; nested …
Run Code Online (Sandbox Code Playgroud)

hibernate criteria-api spring-data-jpa

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