我有一个 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)
这可能是什么原因?
我有以下代码片段用于构建条件生成器的条件。
想知道是否有任何方法可以使其更好,因为我将有更多的条件和相同的条件将用于获取记录计数。
任何见解都是非常值得赞赏的
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) 我正在尝试编写一个相当于以下 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实体 …
我想使用 JPA 标准 api 调用 postgresql 函数jsonb_path_exists(https://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 …
所以我喜欢学习关于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) 我想在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
我有一个名为
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) criteria-api ×7
jpa ×5
java ×3
hibernate ×2
jpa-2.0 ×2
c# ×1
criteria ×1
eclipselink ×1
java-ee ×1
jpa-2.1 ×1
json ×1
nested ×1
nhibernate ×1
postgresql ×1