我正在尝试使用Hibernate组合一个复杂的查询.我一直倾向于Criteria,但我开始怀疑它不可能,所以任何建议都会有所帮助.
我有一个如下的实体结构:
public class Attribute {
private Integer id;
private String name;
private Set<Value> values;
}
public class Instance {
private Integer id;
private int instanceRef;
private Set<Value> values;
}
public class Value {
private Integer id;
private Attribute attribute;
private String localAttributeName;
private Instance instance;
private String value;
}
Run Code Online (Sandbox Code Playgroud)
这些实体与您期望的相关:
value.attribute_id --> attribute.id
value.instance_id --> instance.id
Run Code Online (Sandbox Code Playgroud)
现在,我希望能够获取一组属性/值对(字符串)并查找包含所有这些属性/值对的所有实例.在Value中,attribute和localAttributeName中只有一个是非null,因此属性名称可以匹配localAttributeName或attribute.name.最后一次使事情复杂化,Value上的唯一索引是(实例,属性,值)或(实例,localAttributeName,value) - 也就是说,在实例中,任何给定的Attribute都可能有多个值.
这是我到目前为止:
public List<Instance> getMatchingInstances(Map<String, String> attrValues) {
Criteria crit = session.createCriteria(Instance.class, "i");
for(Map.Entry<String, String> entry : attrValues) { …Run Code Online (Sandbox Code Playgroud) 假设Item和Bid是实体:Item有很多Bids.它们以典型的父/子关系映射到Hibernate中:
<class name="Item" table="ITEM">
...
<set name="bids" inverse="true">
<key column="ITEM_ID"/>
<one-to-many class="Bid"/>
</set>
</class>
Run Code Online (Sandbox Code Playgroud)
在执行此查询后尝试访问每个项目的出价时,如何避免n + 1选择?
List<Item> items = session.createCriteria(Item.class)
.createAlias("bids", "b").
.add(Restrictions.gt("b.amount", 100)).
.list();
Run Code Online (Sandbox Code Playgroud)
注意我需要一个热切的提取出价,但对集合有进一步的限制(b.amount> 100)
我尝试了下面的失败:
List<Item> items = session.createCriteria(Item.class)
.setFetchMode("bids", FetchMode.JOIN).
.createAlias("bids", "b").
.add(Restrictions.gt("b.amount", 100)).
.list();
List<Item> items = session.createCriteria(Item.class)
.createCriteria("bids")
.add(Restrictions.gt("amount", 100)).
.list();
Run Code Online (Sandbox Code Playgroud) 我有一个带有列名的sql表A.
name, id1, id2, val1
Run Code Online (Sandbox Code Playgroud)
和一个带有列名的表B.
id1, id2, key1, key2
Run Code Online (Sandbox Code Playgroud)
这是我的SQL查询
SELECT
v1.id1,
v1.id2
FROM (
SELECT
A.id1,
A.id2,
min(val1) AS x
FROM A
JOIN B ON A.id1 = B.id1 AND A.id2 = B.id2
GROUP BY A.id1, A.id2
) AS v1
WHERE v1.x > 10
Run Code Online (Sandbox Code Playgroud)
使用DetachedCriteria我能够形成子查询
DetachedCriteria subCriteria = DetachedCriteria.forClass(A_model.class);
subCriteria.createAlias("b", "b_model");
subCriteria.setProjection(Projections.projectionList()
.add(Projections.groupProperty("id1"))
.add(Projections.groupProperty("id2"))
.add(Projections.min("val1"),"x");
Run Code Online (Sandbox Code Playgroud)
但我在创建外部查询时遇到了困难.
任何建议我如何创建上述SQL的标准?
谢谢你的期待.
我有以下持久化课程:
public class Code {
@ElementCollection(targetClass = CodeValue.class)
@MapKeyClass(CodeProperty.class)
@JoinTable(name="code_properties")
@CreateIfNull( value = false )
private Map<CodeProperty,CodeValue> propertiesMap =
new HashMap<CodeProperty, CodeValue>();
...
}
public class CodeProperty {
private String name;
...
}
public class CodeValue {
private String value;
...
}
Run Code Online (Sandbox Code Playgroud)
而我试图让一些性质我有过滤代码列表propertiesMap(例如,其中一个名为"颜色"属性的值为"绿色"的代码.
我使用以下基本标准:
Criteria criteria = currentSession()
.createCriteria(Code.class, "code")
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)
当我尝试执行收集过滤器时(如此处所示):
criteria.createAlias("code.properties", "p");
criteria.add(Restrictions.eq("p.foo", "test1"));
criteria.setFetchMode("code.properties", FetchMode.JOIN);
criteria.list();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
org.hibernate.QueryException: could not resolve property: foo of: com.example.CodeValue
Run Code Online (Sandbox Code Playgroud)
这意味着,我真的不明白为什么,hibernate正在考虑code.properties是CodeValue而不是地图!
我也尝试在不创建别名的情况下访问此字段,这样hibernate似乎可以访问正确的 …
我正在开发一个包含大量复杂Hibernate标准查询的Java应用程序.我想测试这些标准,以确保他们选择正确的,只有正确的对象.当然,其中一种方法是建立内存数据库(例如HSQL),并在每次测试中使用条件对该数据库进行往返,然后断言查询结果符合我的期望.
但我正在寻找一个更简单的解决方案,因为Hibernate标准只是一种关于Java对象的特殊逻辑谓词.因此,理论上,它们可以在不访问任何数据库的情况下进行测试.例如,假设有一个名为的实体Cat:
class Cat {
Cat(String name, Integer age){
this.name = name;
this.age = age;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情来创建条件查询:
InMemoryCriteria criteria = InMemoryCriteria.forClass(Cat.class)
.add(Restrictions.like("name", "Fritz%"))
.add(Restrictions.or(
Restrictions.eq("age", new Integer(0)),
Restrictions.isNull("age")))
assertTrue(criteria.apply(new Cat("Foo", 0)))
assertTrue(criteria.apply(new Cat("Fritz Lang", 12)))
assertFalse(criteria.apply(new Cat("Foo", 12)))
Run Code Online (Sandbox Code Playgroud)
标准可以在生产代码中使用,如下所示:
criteria.getExecutableCriteria(session); //similar to DetachedCriteria
Run Code Online (Sandbox Code Playgroud)
是否有任何Java库可以进行此类测试?
我想使用"group by"编写条件查询,并希望返回所有列.
Plane sql是这样的:
select * from Tab group by client_name order by creation_time;
Run Code Online (Sandbox Code Playgroud)
我知道它会有count(distinct client_name)多少行.
我当前的查询似乎没有给出正确的结果如下:
Criteria criteria = getSession(requestType).createCriteria(Tab.class);
criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("client_name")));
criteria.addOrder(Order.asc("creationTime"));
Run Code Online (Sandbox Code Playgroud)
此查询"client_name"仅返回.我不想手动输入所有列名.必须有某种方式,可以做些什么?
我正在使用Hibernate保护我的网站免受SQL注入.
我听说Hibernate Criteria API比HQL更强大.Hibernate Criteria Api是否完全防止SQL注入?
java hibernate sql-injection criteria-api hibernate-criteria
我有以下dao方法:
@Override
public List<AdminRole> findAll() {
Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(AdminRole.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return criteria.list();
}
Run Code Online (Sandbox Code Playgroud)
实际上我想从数据库中检索所有条目.
有时我看到重复.当我使用AdminRole添加用户时会发生这种情况.
我已经读过,当我使用EAGERfetch类型时,这是可能的,这应该是修复添加以下行:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)
但这对我没有帮助.
我的映射:
@Entity
@Table(name = "terminal_admin_role")
public class AdminRole {
@Id
@Column(name = "role_id", nullable = false, unique = true)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id")
@SequenceGenerator(name = "user_id", sequenceName = "user_id")
private Long adminId;
@Column(name = "role")
private String role;
public AdminRole(String role) {
this.role = role;
}
public AdminRole() {
}
// get set …Run Code Online (Sandbox Code Playgroud) 我试图使用hibernate条件查询从表中选择列
Criteria cr = session.createCriteria(OfferCashbackMaster.class)
.setProjection(Projections.projectionList()
.add(Projections.property("txnType"), "txnType")
.add(Projections.property("off_Discription"), "off_Discription"))
.setResultTransformer(Transformers.aliasToBean(OfferCashbackMaster.class))
.add(Restrictions.and(Restrictions.eq("aggregatorId", aggregatorId),
Restrictions.eq("txnType", txnType)));
Run Code Online (Sandbox Code Playgroud)
txnType投影中提到的名称与限制发生冲突.
给我以下错误
Hibernate:
select
this_.OFFER_CODE as y0_,
this_.TXN_TYPE as y1_,
this_.VALID_TO as y2_,
this_.OFFER_DISCRIPTION as y3_
from OFFER_CASHBACK_MASTER this_
where
(this_.AGGREGATOR_ID=? and y1_=?)
2018-02-25/15:42:41.756 WARN: util.JDBCExceptionReporter -
SQL Error: 1054, SQLState: 42S22
2018-02-25/15:42:41.757 ERROR: util.JDBCExceptionReporter -
Unknown column 'y1_' in 'where clause'
Run Code Online (Sandbox Code Playgroud)
我们如何解决这个问题?
我有一个 spring boot 2.7.5 和 hibernate 5.6.12 项目,我想升级到 spring boot 3.1.0 和 hibernate 6.6.2 我正在尝试数据库中的查询计数以获取数据库中的记录总数,我得到错误
org.hibernate.sql.ast.SqlTreeCreationException:无法在 org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.prepareReusablePath(BaseSqmToSqlAstConverter.java:3349) ~[hibernate-core- 6.2.2.Final.jar:6.2.2.Final]
基类是:
public class JPADaoImpl {
protected final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
@Qualifier("dataSource")
protected DataSource dataSource;
@PersistenceContext
protected EntityManager entityManager;
protected <T> PageData<T> getPageData(CriteriaQuery<T> criteria,Root<T> root,Integer pStart, Integer pSize,LockModeType lockModeType) throws Exception{
PageData<T> pageData =null;
try {
pageData = new PageData<T>();
criteria.distinct(true);
criteria.select(root);
TypedQuery<T> query = getPersistenceQuery(criteria, pStart, pSize, lockModeType);
if (pStart == null || pSize == null) {
pageData.setData(query.getResultList());
return …Run Code Online (Sandbox Code Playgroud) hibernate ×9
java ×8
criteria ×3
orm ×2
criteria-api ×1
group-by ×1
mysql ×1
postgresql ×1
spring-boot ×1
unit-testing ×1