我第一次使用Criteria API.它是关于抽象通用构建器的查询:
public TypedQuery<T> newQuery( Manager<?,T> manager )
{
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
Class<T> genericClass = ( Class<T> ) ( ( ParameterizedType ) manager.getClass().getGenericSuperclass() ).getActualTypeArguments()[1];
CriteriaQuery<T> criteriaQuery = builder.createQuery( genericClass );
Root<T> root = criteriaQuery.from( genericClass );
...
}
Run Code Online (Sandbox Code Playgroud)
该调用默认为实体上找到的所有关系criteriaQuery.from( genericClass );生成SQL INNER JOIN.这是一个问题,因为每个关系都为空(DB NULL或不使用外键且具有无效引用的DB)这些实体将在结果列表中丢失,从而有效地产生错误的搜索结果.
可以在此处找到一个示例:JPA Criteria query Path.get left join is it possibile
对于由此类/方法实例化的查询,我想要发生的是实体上的所有关系,这里genericClass映射为optional = true
@ManyToOne( FetchType.EAGER, optional = true )
@JoinColumn( name = "CLOSE_USER_ID", referencedColumnName = "USER_ID" )
private …Run Code Online (Sandbox Code Playgroud) 您是否可以从JPA规范派生,如果@PrimaryKeyJoinColumn(...)没有可插入和可更新的参数,则与之相同
@JoinColumn(..., insertable = false, updatable = false)
Run Code Online (Sandbox Code Playgroud)
要么
@JoinColumn(...,insertable = true,updatable = true)
当用于常规(非继承)关联时?他们应该可以互换吗?设置的可插入和可更新属性是什么?它们是否适合任何东西?请注意,我只是针对两者(似乎)实现的只读属性...
我与EclipseLink和Hibernate的映射异常相当不一致......
这是@PrimaryKeyJoinColumnJavaEE 5 + 6 Javadoc:
PrimaryKeyJoinColumn(JavaEE 5)
PrimaryKeyJoinColumn(JavaEE 6)
引用:
...它可以用在OneToOne映射中,其中引用实体的主键用作引用实体的外键.
我有一个实体映射如下:
@Entity
@Table(name = "Groups")
@IdClass(value = GroupId.class)
public class Group implements Serializable
{
@Id
@Column(name = "round_id")
private Integer roundId;
@Id
@Column(name = "ordinal_nbr")
private Integer ordinalNbr = 0;
...
}
Run Code Online (Sandbox Code Playgroud)
它有一个复合键,(round_id, ordinal_nbr)用于指示一轮中组的顺序.
现在假设一个连接表包含通过自引用(从组到组)链接有序组的实体:
CREATE TABLE GroupLinks
(
parent_round_id INTEGER NOT NULL,
parent_ordinal_nbr SMALLINT NOT NULL,
child_round_id INTEGER NOT NULL,
child_ordinal_nbr SMALLINT NOT NULL,
PRIMARY KEY (parent_round_id, parent_ordinal_nbr, child_round_id, child_ordinal_nbr),
FOREIGN KEY (parent_round_id, parent_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr),
FOREIGN KEY (child_round_id, child_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr)
); …Run Code Online (Sandbox Code Playgroud) 我有一个表有两个外键到两个不同的表,两个外键共享一列:
CREATE TABLE ZipAreas
(
country_code CHAR(2) NOT NULL,
zip_code VARCHAR(10) NOT NULL,
state_code VARCHAR(5) NOT NULL,
city_name VARCHAR(100) NOT NULL,
PRIMARY KEY (country_code, zip_code, state_code, city_name),
FOREIGN KEY (country_code, zip_code) REFERENCES Zips (country_code, code),
FOREIGN KEY (country_code, state_code, city_name) REFERENCES Cities (country_code, state_code, name)
)
Run Code Online (Sandbox Code Playgroud)
如您所见,有两个FK共享country_code(巧合地引用了引用路径末尾的同一列).实体类看起来像(JPA 1.0 @IdClass):
@Entity
@Table(name = "ZipAreas")
@IdClass(value = ZipAreaId.class)
public class ZipArea implements Serializable
{
@Id
@Column(name = "country_code", insertable = false, updatable = false)
private String countryCode;
@Id
@Column(name = …Run Code Online (Sandbox Code Playgroud) 我在JSF EL中找到了instanceof运算符,但它在使用时会引发异常.它显然是保留但没有实现?什么时候(可能)可用,如果还没有比我现在使用的JSF 1.2更新的版本?
我有一个简单的JOINED文档层次结构:
CREATE TABLE Documents
(
id INTEGER NOT NULL,
discriminator ENUM('official','individual','external') NOT NULL,
file_name VARCHAR(200) NOT NULL,
PRIMARY KEY (id)
);
CREATE SystemDocuments
(
id INTEGER NOT NULL,
binary_data BLOB NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES Documents (id)
);
CREATE ExternalDocuments
(
id INTEGER NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES SystemDocuments (id)
);
Run Code Online (Sandbox Code Playgroud)
如您所见,所有子表都与Documents表共享相同的ID.除此之外,SystemDocuments添加一binary_data列并且不ExternalDocuments添加任何新属性.(还要注意有层次结构中表示为其他两个具体子表'official'和'individual'它在这里是没有意义的.)
以下是上表的映射:
Document.java:
@Entity
@Table(name = "Documents")
@Inheritance(strategy = InheritanceType.JOINED) …Run Code Online (Sandbox Code Playgroud) 在Java中,如何获取Java EE(CDI)代理的原始类对象和/或类名?
在getName()代理实例上使用时,返回的名称就像
com.company.employeemgmt.EmployeeManager$Proxy$_$$_WeldSubclass
Run Code Online (Sandbox Code Playgroud)
Java SE(7)或EE(6)中是否有一些功能可以返回原始的,未经过代理的类实例或其名称?
我需要:
com.company.employeemgmt.EmployeeManager
Run Code Online (Sandbox Code Playgroud)
当然,我可以简单地使用字符串操作,但我想知道这些功能是否已经是Java-(EE)-inbuilt.
我已经找到了java.reflect.Proxy,我可以用来检测代理:
public static void doSomething( Class<? implements Serializable> managerClass )
{
if ( Proxy.isProxyClass( managerClass ) )
{
// unproxy how?
managerClass = managerClass.getUnproxiedClass();
}
// delegate
doSomething( managerClass.getName() );
}
public static void doSomething( String prefix )
{
// do real work
...
}
Run Code Online (Sandbox Code Playgroud)
...,但你怎么解除原来的课程呢?
更新:
诀窍是访问MyUtil.doSomething( EmployeeManager.class )(或 MyUtil.doSomething( EmployeeManager.class.getName() )),但我想使用/传递MyUtil.doSomething( this.getClass() )(或 MyUtil.doSomething( this.getClass().getName() ))来自所有客户端,因为这些代码可以被复制而无需手动更改.
我有以下JPQL查询:
SELECT il
FROM InsiderList il
WHERE ( il.deleteFlag IS NULL OR il.deleteFlag = '0' )
AND il.clientId = :clientId
AND ( LOWER( il.name ) LIKE :searchTerm
OR il.nbr LIKE :searchTerm
OR LOWER( il.type ) LIKE :searchTerm
OR LOWER( il.description ) LIKE :searchTerm )
Run Code Online (Sandbox Code Playgroud)
客户希望我们能够搜索该nbr字段,这是一个java.lang.Long.
问:
如何java.lang.Long使用JPQL 执行LIKE搜索?
我为地理区域(如大洲,国家,州等)提供了以下JOINED继承根实体:
@Entity
@Table(name = "GeoAreas")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class GeoArea implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
protected Integer id;
@Column
protected String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id", referencedColumnName = "id")
protected GeoArea parent;
...
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,地理区域有一个简单的自动ID,如PK,名称以及与其父级的关系(自引用).请注意parent映射为的地理区域关系FetchType.LAZY.在数据库中,FK parent_id正在NOT NULL使关系成为可选的.默认为@ManyToOneis optional = true,因此映射似乎是正确的.
子类定义了其他属性,实际上并不重要.数据库中的数据正确链接,因为可以通过JPQL列出地理区域而没有问题(FetchType.EAGER映射略有不同parent,请参见文本结尾):

每一行都是以下的实例:
public class ArenaListViewLine
{
private final Integer arenaId;
private final String arenaName;
private final String arenaLabel;
private …Run Code Online (Sandbox Code Playgroud) 简单的问题:
你如何创建一个HTML锚点
<a id="organization" />
Run Code Online (Sandbox Code Playgroud)
与JSF,例如
<h:outputLink ... />
Run Code Online (Sandbox Code Playgroud)
或另一个JSF链接组件?有可能吗?
jpa ×7
java ×5
hibernate ×4
jsf ×2
anchor ×1
cdi ×1
class ×1
criteria-api ×1
eclipselink ×1
el ×1
foreign-keys ×1
html ×1
inheritance ×1
instanceof ×1
java-ee ×1
jpa-2.0 ×1
jpql ×1
jsf-2 ×1
lazy-loading ×1
long-integer ×1
many-to-many ×1
mapping ×1
metamodel ×1
overlapping ×1
primary-key ×1
proxy ×1
sql ×1
sql-like ×1